synchronized使用的一些注意点

作者: hexter | 来源:发表于2016-03-09 16:20 被阅读1201次

    关于synchronized、锁、同步的原理看这里》》

    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效果。

    相关文章

      网友评论

      本文标题:synchronized使用的一些注意点

      本文链接:https://www.haomeiwen.com/subject/jsttlttx.html