011 深入理解synchronized
Posted trekxu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了011 深入理解synchronized相关的知识,希望对你有一定的参考价值。
一 .概述
在前面我们使用synchronized完成了一个原子方法的实现.现在我们需要深入的理解这个关键词.
二 . 使用方式
对于这个关键词我们的使用方式有四种:
[1]修饰普通方法
[2]修饰静态方法
[3]对实例对象加互斥锁
[4]对类对象加互斥锁
我们首先需要知道的就是synchronized就是使用互斥锁的方式完成线程的同步,
原理就是对于临界资源的操作保持互斥.
三 . 实现方式
public synchronized void add1() { count ++; } public static void add2() { count ++; } public void add3() { synchronized (this) { count ++ ; } } public static void add4() { synchronized (Test.class) { count ++; } }
上面的代码之中,我们分别将synchronized关键词放在了不同的地方使用,看起来使用的情况是比较复杂的.
但是总结一些:
synchronized就是完成了互斥锁的概念,获取到了锁的线程可以运行,其它没有获取锁的线程如抢不到锁就进入
block队列之中.
那么:synchronized关键词修饰实例方法就相当于是用当前调用方法的对象作为互斥锁.
修饰的静态方法就相当于拿到class字节码作为互斥锁.
四 . 限制
synchronized关键词代表的互斥锁的限制比较大,
一旦一个线程由于抢夺锁失败就会进入阻塞队列之中,需要等待锁被重新释放.
如果那个抢占锁的线程运行的时间很长,那么互斥锁的代价就太高了.
因此JDK在后面引入了偏向锁,自旋锁来改进互斥锁,
但是他们本质上都是互斥锁,因此这个关键词代表的互斥锁是一种重量级别的锁.
以上是关于011 深入理解synchronized的主要内容,如果未能解决你的问题,请参考以下文章
深入理解Java中的同步静态方法和synchronized(class)代码块的类锁