synchronized

synchronized 的实现原理与应用

synchronized 称为 重要级锁

Synchronized的作用主要有三个

原子性:确保线程互斥的访问同步代码;
可见性:保证共享变量的修改能够及时可见,其实是通过Java内存模型中的 “对一个变量unlock操作之前,必须要同步到主内存中;如果对一个变量进行lock操作,则将会清空工作内存中此变量的值,在执行引擎使用此变量前,需要重新从主内存中load操作或assign操作初始化变量值” 来保证的;
有序性:有效解决重排序问题,即 “一个unlock操作先行发生(happen-before)于后面对同一个锁的lock操作”;

synchronized 保证每个时刻只有一个线程执行同步代码,相当于是让线程顺序执行同步代码。

java 中的每一个对象都可以作为锁 表现以下3种形式
1 对于普通同步方法,锁是当前实例对象
2对于静太同步方法,锁是当前类的Class 对象。
3对于同步方法块,锁是Synchonized 括号里配置的对象

Synchronized总共有三种用法

当synchronized作用在实例方法时,监视器锁(monitor)便是对象实例(this);
当synchronized作用在静态方法时,监视器锁(monitor)便是对象的Class实例,因为Class数据存在于永久代,因此静态方法锁相当于该类的一个全局锁;
当synchronized作用在某一个对象实例时,监视器锁(monitor)便是括号括起来的对象实例;

synchronize和Lock的区别:

两者都是锁,用来控制并发冲突,区别在于Lock是个接口,提供的功能更加丰富,除了这个外,他们还有如下区别:

    1. synchronize自动释放锁,而Lock必须手动释放,并且代码中出现异常会导致unlock代码不执行,所以Lock一般在Finally中释放,而synchronize释放锁是由JVM自动执行的。
    2. Lock有共享锁的概念,所以可以设置读写锁提高效率,synchronize不能。(两者都可重入)
    3. Lock可以让线程在获取锁的过程中响应中断,而synchronize不会,线程会一直等待下去。lock.lockInterruptibly()方法会优先响应中断,而不是像lock一样优先去获取锁。
    4. Lock锁的是代码块,synchronize还能锁方法和类。

你可能感兴趣的:(synchronized)