一个实例中,多个synchronized方法的调用
2017-09-13 00:00
155 查看
public class ThreadA extends Thread {
private MyObject object;
public ThreadA(MyObject object){
this.object = object;
}
public void run(){
super.run();
object.menthodA();
}
}
public class ThreadB extends Thread {
private MyObject object;
public ThreadB(MyObject object){
this.object = object;
}
public void run(){
super.run();
object.methodB();
}
}
public class Run {
public static void main(String args[]){
MyObject myObject = new MyObject();
ThreadA threadA = new ThreadA(myObject);
threadA.setName("A");
threadA.start();
ThreadB threadB = new ThreadB(myObject);
threadB.setName("B");
threadB.start();
}
}
代码如上所示,MyObject类有两个方法,分别创建两个线程调用方法A和方法B:
1、方法A和方法B都没有加synchronized关键字时,调用方法A的时候可进入方法B;
2、方法A加synchronized关键字而方法B没有加时,调用方法A的时候可以进入方法B;
3、方法A和方法B都加了synchronized关键字时,调用方法A之后,必须等A执行完成才能进入方法B;
4、方法A和方法B都加了synchronized关键字时,且方法A加了wait()方法时,调用方法A的时候可以进入方法B;
5、方法A加了synchronized关键字,而方法B为static静态方法时,调用方法A的时候可进入方法B;
6、方法A和方法B都是static静态方法,且都加了synchronized关键字,则调用方法A之后,需要等A执行完成才能进入方法B;
7、方法A和方法B都是static静态方法,且都加了synchronized关键字,创建不同的线程分别调用A和B,需要等A执行完成才能执行B(因为static方法是单实例的,A持有的是Class锁,Class锁可以对类的所有对象实例起作用)
总结:
同一个object中多个方法都加了synchronized关键字的时候,其中调用任意方法之后需等该方法执行完成才能调用其他方法,即同步的,阻塞的;
此结论同样适用于对于object中使用synchronized(this)同步代码块的场景;
synchronized锁定的都是当前对象!
private MyObject object;
public ThreadA(MyObject object){
this.object = object;
}
public void run(){
super.run();
object.menthodA();
}
}
public class ThreadB extends Thread {
private MyObject object;
public ThreadB(MyObject object){
this.object = object;
}
public void run(){
super.run();
object.methodB();
}
}
public class Run {
public static void main(String args[]){
MyObject myObject = new MyObject();
ThreadA threadA = new ThreadA(myObject);
threadA.setName("A");
threadA.start();
ThreadB threadB = new ThreadB(myObject);
threadB.setName("B");
threadB.start();
}
}
代码如上所示,MyObject类有两个方法,分别创建两个线程调用方法A和方法B:
1、方法A和方法B都没有加synchronized关键字时,调用方法A的时候可进入方法B;
2、方法A加synchronized关键字而方法B没有加时,调用方法A的时候可以进入方法B;
3、方法A和方法B都加了synchronized关键字时,调用方法A之后,必须等A执行完成才能进入方法B;
4、方法A和方法B都加了synchronized关键字时,且方法A加了wait()方法时,调用方法A的时候可以进入方法B;
5、方法A加了synchronized关键字,而方法B为static静态方法时,调用方法A的时候可进入方法B;
6、方法A和方法B都是static静态方法,且都加了synchronized关键字,则调用方法A之后,需要等A执行完成才能进入方法B;
7、方法A和方法B都是static静态方法,且都加了synchronized关键字,创建不同的线程分别调用A和B,需要等A执行完成才能执行B(因为static方法是单实例的,A持有的是Class锁,Class锁可以对类的所有对象实例起作用)
总结:
同一个object中多个方法都加了synchronized关键字的时候,其中调用任意方法之后需等该方法执行完成才能调用其他方法,即同步的,阻塞的;
此结论同样适用于对于object中使用synchronized(this)同步代码块的场景;
synchronized锁定的都是当前对象!
相关文章推荐
- 一个实例中,多个synchronized方法的调用
- 抽象类与接口--由一个调用接口方法的小实例所想到的
- Loner_li 面向对象 实例练习--要求:用户输入上述四个字段的值,实例化一个Computer类,然后调用类中方法输出电脑详细信息
- 定义平面中的一个Circle类, 1编写一个无参数构造函数, 2编写一个有参的构造函数 3在主函数中调用无参构造函数生成圆的实例c1,调用有参构造函数生成圆的实例c2,调用实例方法判断c1和c2是否重
- A类中有B类的实例,B类中有C类的实例,可以在A类中的一个方法中通过B调用C中的方法吗?
- 如题,既然直接对一个实例发送方法名就可以调用这个方法,那为什么还要使用performSelector:去调呢?两者u有啥区别
- Qt5.9动态调用c++的dll方法(Qt5.9调用MQTT的一个实例)
- 具体的一个实例,展示如何访问实例变量和调用成员方法
- Spring入门学习——调用一个实例工厂方法创建Bean
- 当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的.
- JS调用OC简单实例-传递一个或者多个参数给oc方法
- ios 中调用函数的方法是消息传递,这个和普通的函数调用的区别是,你可以随时对一个对象传递任何消息,而不需要在编译的时候声明这些方法。所以Objective-C可以在runtime的时候
- 51_52创建动态类的实例对象及调用其方法
- 子类与父类实例变量,静态方法调用
- 一个安全彻底关闭实例Excel.Application后产生的进程方法
- 手写一个同时支持的函数式和面向对象两种调用方法js库
- 定义一个交通工具(Vehicle)的类,在测试类Vehicle中的main()中实例化一个交通工具对象,通过方法给它初始化speed,size的值,并打印出来。另外,调用加速,减速的方法对速度进行改变
- Ruby中,类方法和实例方法的一个有趣的例子
- 获取调用该方法的上一个方法
- SQLServer2000安装程序提示“有一个挂起的安装实例,请重起机器”的解决方法