synchronized是什么?
并发编程时,为保证线程安全时用到
synchronized的作用
1、保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区;
2、还可以保证共享变量的内存可见性
synchronized锁的对象
Java中每一个对象都可以作为锁,这是synchronized实现同步的基础。
synchronized可以修饰的方法类型
1、普通同步方法(实例方法),锁是当前实例对象 ,进入同步代码前要获得当前实例的锁
2、静态同步方法,锁是当前类的class对象 ,进入同步代码前要获得当前类对象的锁
3、同步方法块,锁是括号里面的对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。
synchronized是重量级锁?
Java SE 1.6 对 synchronized 进行了各种优化之后,有些情况下它就并不那么重,Java SE 1.6 中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁。
针对 synchronized 获取锁的方式,JVM 使用了锁升级的优化方式,就是先使用偏向锁优先同一线程然后再次获取锁,如果失败,就升级为 CAS 轻量级锁,如果失败就会短暂自旋,防止线程被系统挂起。最后如果以上都失败就升级为重量级锁。
对了锁只能升级,不能降级。
synchronized和Lock的区别
synchronized是关键字,Lock是一个接口
synchronized会自动释放锁,Lock必须手动释放锁
synchronized不可中断,Lock可以中断。(这里的中断时指,是否中断等待,先去做别的事情)
Lock能知道是否拿到了锁,synchronized不能
synchronized能锁方法和代码块,Lock只能锁代码块
Lock可以使用读锁提高读线程读效率,synchronized没有类似操作
synchronized是非公平锁,ReentrantLock可以设置公平和非公平
synchronized内部的实现了解吗?
它是如何保证同一时刻只有一个线程可以进入临界区呢?
为了回答这个问题,
JVM的对象存储
在 JVM 中,对象在内存中分为三块区域
对象头:默认存储对象的HashCode,分代年龄和锁标志位信息。
实例数据:类的数据信息,⽗类的信息
填充