对 java线程synchronized的理解--转自新浪小竞

来源:互联网 发布:excel进行数据分析 编辑:程序博客网 时间:2024/06/07 02:09

Java中内置了对于对象并发访问的支持,每一个对象都有一个监视器(monitor),同时只允许一个线程持有监视器从而进行对对象的访问,那些没有获得监视器的线程必须等待直到持有监视器的线程释放监视器。对象通过synchronized关键字来声明线程必须获得监视器才能进行对自己的访问。
例如

public void test(){

  synchronized(obj){

   //同步块1

    obj.add();

    ... ...

  }

}

当第一个个线程A 走到 synchronized(obj) 时,它将持有 obj 的监视器并执行同步块中的语句,当另一个线程B 走到 synchronized(obj)时,因为 obj 的监视器被A占用,所以B 线程只能排队

但是 假如 又有一个方法:

public void test2(){

  synchronized(otherObj){

   //同步块2

    obj.add();

    ... ...

  }

当线程B 去访问 同步块2 时,B将持有 otherObj 的监视器,并执行 obj.add()等代码,这时虽然 线程A持有obj的 监视器,但是 线程B  还是可以执行 obj.add(),因为 只要线程B 持有otherObj 监视器 就可以进入 同步块2 

 

判断 线程 能否 执行同步块中的语句,只要看 该线程 是否持有 锁对象 的监视器,持有监视器 代表可以锁住 这个同步快,让其他 的线程 无法同时执行这个同步块,但并不是 锁住了这个锁对象,不代表其他线程无法访问这个锁对象

 

就像 线程A 和线程 B,因为 他们分别 持有 obj和 otherObj 监视器,所以他们 都有权利 进入 各自的同步块中,同时 执行  obj.add(); 所以 这就不能实现  obj.add(); 的同步

 

原创粉丝点击