简单描述下 synchronized 是干什么用
synsynchronized一种互斥锁,一次只能有一个线程进入synchronized锁住的代码块,从而解决多线程安全问题
synchronized 可以用在什么地方
synchronized 可以修饰
- 实例方法(锁的是当前对象)
- 静态方法(锁的是class对象)
- 代码块(锁的是传入的对象)
synchronized 1.6 和 1.7之间的区别是什么
首先最大的区别是 1.6之前synchronized 都是重量级的锁,而且加锁的操作依赖底层操作系统
所以会消耗系统很多的资源
而 1.6之后呢 加入了 偏向锁,轻量级锁的概念,不依赖底层操作系统,依赖jvm,对系统的消耗降低
简单来说说 偏向锁/轻量级锁/重量级锁
首先在内存中 对象由 对象头 对象实际数据 和 对其填充 组成的
重点在于对象头,对象头又由几部分组成,重点关注 mark word 就可以了
mark word 存储着 锁的信息 ,每一个对象 又对应了一个 monitor 对象,而monitor对象存储着 当前持有锁的线程和等待的线程
- 偏向锁—》偏向锁会在 mark word 中记录当前持有锁的线程的id,只有这个id的线程才可以执行代码
- 轻量级锁—》当其他的线程尝试获取锁的时候,会通过cas 来修改 线程id,如果失败了说明 有竞争,会将锁升级成 轻量级锁
- 重量级锁—》当一个线程进行了很多次的cas 依然没有获取到锁的时候 会升级成重量级锁,重量级锁操作的就是monitor对象
synchronized 1.6之后 引入了 偏向锁和轻量级锁就是为了 在不同的场景中 使用不同的策略,从而降低损耗。