并发编程:synchronized的理解

  • 用synchronized修饰方法:如果该对象中有多个同步方法,则当一个线程获执行对象中的一个synchronized方法,则该对象中其它同步方法也不允许别的线程执行
  public synchronized void method(){}

  等同于

  public void method() {  
      synchronized (this) {  
          //..  
      }  
  }

 

  • 同步代码块

  当没有明确的对象作为锁,只是想让一段代码同步时,能够创建一个特别的instance变量(他得是个对象)来充当锁

  private byte[] lock = new byte[0]; 
  public void method() {  
       synchronized(lock) { 
       //..
       }
    }
  • 用synchronized修饰static方法:方法获得的是所属的类的类锁
  class Foo {  
        public synchronized static void method1() {}  
        public void method2() {  
            synchronized(Foo.class) { 
            //..
            } 
}
}
  • 注意:在使用synchronized块来同步方法时,非静态方法可以通过this来同步,而静态方法必须使用class对象来同步,但是非静态方法也可以通过使用class来同步静态方法。但是静态方法中不能使用this来同步非静态方法。这点在使用synchronized块需要注意。
  • Java的synchronized块是可重入的:重入锁死
posted @ 2017-04-25 17:12  感遇  阅读(170)  评论(0)    收藏  举报