大家好,我是哪吒。
上一章提到了一个关于 i++ 和 ++i 的面试题打趴了所有人,最终方案是在两个方法上添加synchronized关键字,从而避免i++的线程安全问题,不过,这样真的好吗?在所有有线程安全的方法都添加synchronized?
答案是显而易见的,不行。
synchronized会极大的降低程序的性能,导致整个程序几乎只能支持单线程操作,性能显著降低。
那么,如何解决呢?
锁的粒度更小了,也解决了这个问题,确实可以的。
package com.guor.thread;public class SynchronizedTest2 { int a = 1; int b = 1; public void add() { System.out.println("add start"); synchronized (this) { for (int i = 0; i < 10000; i++) { a++; b++; } } System.out.println("add end"); } public synchronized void compare() { System.out.println("compare start"); synchronized (this) { for (int i = 0; i < 10000; i++) { boolean flag = a < b; if (flag) { System.out.println("a=" + a + ",b=" + b + "flag=" + flag + ",a < b = " + (a < b)); } } } System.out.println("compare end"); } public static void main(String[] args) { SynchronizedTest2 synchronizedTest = new SynchronizedTest2(); new Thread(() -> synchronizedTest.add()).start(); new Thread(() -> synchronizedTest.compare()).start(); }}为了更好的优化,有的时候可以将synchronized代码块变为区分读写场景的读写锁,也可以考虑悲观锁和乐观锁的区分。
对于读写场景比较多的情况,可以使用ReentrantReadWriteLock区分读写,再次降低锁的粒度,提高程序的性能。
ReentrantReadWriteLock 还可以选择提供了公平锁,在没有明确必须使用公平锁的情况下,尽量不要使用公平锁,公平锁会使程序性能降低很多很多。
简单来说,公平锁(谁先排队,谁先执行),非公平锁(不用排队,每个人都有机会)。
有一天早上,云韵、美杜莎、小医仙结伴去买酱香拿铁,到了咖啡店,先排队,一个一个来。不一会,哪吒来了,也买酱香拿铁,只能在末尾排队。这个就是公平锁。
本文链接:http://www.28at.com/showinfo-26-12358-0.html简单聊一聊公平锁和非公平锁,Parallel并行流
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com
上一篇: 你真的理解Python Qt6基础知识中的信号和槽机制吗?
下一篇: 有了这个代码模板,合并排序手到擒来