synchronized关键字解析

原创
2014/03/15 12:11
阅读数 146

1、一些概念

重入锁:一个线程可对同一对象的锁反复获取,这种锁就称之为重入锁。
读写锁:(不涉及……)

2、一些规则说明

1、非static方法

synchronized void method1()与void method1(){synchronized(this){}}是等价,都是对象锁,锁定当然对象实例

2、static方法

static synchronized void method1()与static void method1(){ synchronized (Foo.class){}}是等价,是等价的,锁定Class的字节码。

所以,static与非static方法是两把锁,相互不干扰!

3、锁定机制解析

public class Foo {
  synchronized void method1() {}
  synchronized void method2() {
    method1();
  }

  static synchronized void methodA() {}
}

当线程A进入到method2方法时,当前线程A就拥有Foo对象x的对象锁,其他线程如果想进入对象x的method2或者method1方法时,就会等待。线程A进入method2时,x的对象锁计数器就会+1,执行method2中的method1(),进入method1方法,x的对象锁计数器再+1,退出method1()方法,x的对象锁计数器-1,再退出method2(),x的对象锁计数器-1,此时x对象对象锁计数器为0,其他线程就会竞争对象x的对象锁!

PS:明显可以看到线程A进入metho2()方法时,本身就拥有对象锁,再进入method1方法再加一把锁,这种锁就是上面介绍的重入锁。

4、其他

读写锁特性:可以分配多个读锁,但只能同时有一个写锁。读写是互斥的!常见的场景是:文件读写,数据中心(数据中心作为代理,本身持有请求过的数据{读锁},没有数据时再向其他位置请求{写锁})。


展开阅读全文
加载中

作者的其它热门文章

打赏
0
8 收藏
分享
打赏
0 评论
8 收藏
0
分享
返回顶部
顶部