synchronized的锁是加在对象实例或者类上面的,而且只能加一把锁。所以,如果对象实例或类有多个方法或块加了synchronized,那么只要有一个线程进入某个synchronized区域,就会在对象或类上设置锁,其他线程,就算是访问该对象或类其他无关的synchronized块也是互斥的。所以如果要让对象或类的多个synchronized区域可以各自独立控制线程互斥。就用如下类似方式:
final Object ob=new Object();
final Object ob2=new Object();
synchronized(ob){...}
synchronized(ob2){...}
根据synchronized是加在对象方法(或块)还是类方法的不同,锁互斥线程的作用域也有不同:
1:synchronized是加在对象方法(或块)(比如dog对象的bake()互斥)上的,只是对访问该dog方法的不同线程互斥,如果还有dog1、dog2,那么不同线程可以各自同时访问dog、dog1、dog2的bake()方法。如果要让dog、dog1、dog2对象实例方法也互斥:
final static Object ob=new Object();
synchronized(ob){...}
2:synchronized加在类方法(静态方法或静态块)上的话,对所有访问线程提供互斥功能,无论是该类的不同实例对象。
synchronized关键字不能被多态继承。如果父类中的某个方法是synchronized的,而子类中覆盖了这个方法,那么默认情况下子类中的这个方法并不是synchronized的,必须显式的在子类的这个方法中加上synchronized关键字才行。当然,不覆盖的话没事。不过子类的那个方法也可以通过调用父类中该相应的方法来实现synchronized效果。
网友评论