锁粗化
锁粗化是一种优化技术: 如果一系列的连续操作都对同一个对象反复加锁和解锁 , 甚至加锁操作都是出现在循环体体之中 , 就算真的没有线程竞争 , 频繁地进行互斥同步操作将会导致不必要的性能损耗 , 所以就采取了一种方案:把加锁的范围扩展(粗化)到整个操作序列的外部 , 这样加锁解锁的频率就会大大降低 , 从而减少了性能损耗 。
18、锁消除
文章插图
锁消除
锁消除是一种优化技术: 就是把锁干掉 。当Java虚拟机运行时发现有些共享数据不会被线程竞争时就可以进行锁消除 。
那如何判断共享数据不会被线程竞争?
利用逃逸分析技术:分析对象的作用域 , 如果对象在A方法中定义后 , 被作为参数传递到B方法中 , 则称为方法逃逸;如果被其他线程访问 , 则称为线程逃逸 。
在堆上的某个数据不会逃逸出去被其他线程访问到 , 就可以把它当作栈上数据对待 , 认为它是线程私有的 , 同步加锁就不需要了 。
19、synchronized
文章插图
synchronized
synchronized是Java中的关键字:用来修饰方法、对象实例 。属于独占锁、悲观锁、可重入锁、非公平锁 。
- 1.作用于实例方法时 , 锁住的是对象的实例(this);
- 2.当作用于静态方法时 , 锁住的是 Class类 , 相当于类的一个全局锁 , 会锁所有调用该方法的线程;
- 3.synchronized 作用于一个非 NULL的对象实例时 , 锁住的是所有以该对象为锁的代码块 。它有多个队列 , 当多个线程一起访问某个对象监视器的时候 , 对象监视器会将这些线程存储在不同的容器中 。
20、Lock和synchronized的区别
文章插图
自动挡和手动挡的区别
Lock: 是Java中的接口 , 可重入锁、悲观锁、独占锁、互斥锁、同步锁 。
- 1.Lock需要手动获取锁和释放锁 。就好比自动挡和手动挡的区别
- 2.Lock 是一个接口 , 而 synchronized 是 Java 中的关键字 , synchronized 是内置的语言实现 。
- 3.synchronized 在发生异常时 , 会自动释放线程占有的锁 , 因此不会导致死锁现象发生;而 Lock 在发生异常时 , 如果没有主动通过 unLock()去释放锁 , 则很可能造成死锁现象 , 因此使用 Lock 时需要在 finally 块中释放锁 。
- 4.Lock 可以让等待锁的线程响应中断 , 而 synchronized 却不行 , 使用 synchronized 时 , 等待的线程会一直等待下去 , 不能够响应中断 。
- 5.通过 Lock 可以知道有没有成功获取锁 , 而 synchronized 却无法办到 。
- 6.Lock 可以通过实现读写锁提高多个线程进行读操作的效率 。
- 足够清晰简单 , 只需要基础的同步功能时 , 用synchronized 。
- Lock应该确保在finally块中释放锁 。如果使用synchronized , JVM确保即使出现异常 , 锁也能被自动释放 。
- 使用Lock时 , Java虚拟机很难得知哪些锁对象是由特定线程锁持有的 。
划重点
相同点:
- 1.主要解决共享变量如何安全访问的问题
- 2.都是可重入锁 , 也叫做递归锁 , 同一线程可一个锁 ,
- 3.保证了线程安全的两大特性:可见性、原子性 。
- 1.ReentrantLock 就像手动汽车 , 需要显示的调用lock和unlock方法 , synchronized 隐式获得释放锁 。
- 2.ReentrantLock 可响应中断 , synchronized 是不可以响应中断的 , ReentrantLock 为处理锁的不可用性提供了更高的灵活性
推荐阅读
- Javascript中类型知识和valueOf和toString()方法
- 漫长的战斗:美国人眼中的朝鲜战争 美国人眼中的朝鲜战争pdf
- 顶戴花翎中的翎有什么讲究 清朝一品官员的顶戴由什么组成
- javascript事件流
- 盘点2020JavaScript游戏框架
- Java分布式锁看这篇就够了
- 静安白茶茶中的瑰宝,黄山贡菊的功效与作用是什么
- 二 鸡肝酒的功效与作用
- 三国演义最喜欢的人物曹操 曹操和关羽是我国四大名著之一什么中的人物
- 抄袭|网易手游《时空中的绘旅人》官博喊话!《王者荣耀》再次被指抄袭