synchronized关键字
作者:互联网
一、synchronized对某个对象进行加索.
object o =new object();
synchronized(o){};任何线程要执行代码块里的代码必须拿到o的锁.
synchronized(this);锁定当前对象.等同于synchronized的方法public synchronized void m(){};
synchronized静态方法锁定的是synchronized(T.class) 类的class.T.class 在同一个classloader中是单例的.
对象的markword上两位记录是否被锁定.
Ps:synchronized既保证了原子性,又保证了可见性.
二、同步方法和非同步方法时候可以被同时调用?
可以的,就像一个人在洗手,一个人在撒尿,互相不影响.
三、synchronized可重入.
可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(前提得是同一个对象或者class).
synchronized和ReentrantLock都是可重入的 ,可重入降低了编程复杂性.
ReentrantLock 和 synchronized 不一样,需要手动释放锁,所以使用 ReentrantLock的时候一定要手动释放锁,并且加锁次数和释放次数要一样.
三、程序之中如果出现异常,默认情况下锁会被释放.这是别的线程会进入代码块,造成数据不一致.
四、synchronized的底层实现
jdk早期 重量级 每次都去os申请线程
1.5之后改成有个锁升级的过程
synchronized(object)
第一个线程进来 是没有加索的,在markword上记录了线程的id (偏向锁)
如果产生线程争抢,升级为 (自旋锁) 一个线程被锁住,另一个线程自选 默认自旋10次
如果10次还得不到锁升级为 (重量级锁) 去操作系统申请资源
锁升级的过程中避免了用户态于内核态之间频繁的切换,效率要高.
什么时候用自旋锁?什么时候用重量级锁?
执行时间过长或者线程说过多用重量级锁. 自旋会占用cpu.
执行时间短(加索代码),线程少,用自旋锁.
标签:重入,synchronized,关键字,线程,自旋,重量级,class 来源: https://www.cnblogs.com/chen-xing-Eli/p/13155372.html