Last active
March 25, 2020 05:22
-
-
Save Hasiy/ce301e1dc742a4a6e443d3aea7781e94 to your computer and use it in GitHub Desktop.
多线程并发问题
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
当只有一个线程写,其它线程都是读的时候,可以用volatile修饰变量 | |
当多个线程写,那么一般情况下并发不严重的话可以用Synchronized, | |
Synchronized并不是一开始就是重量级锁, | |
在并发不严重的时候,比如只有一个线程访问的时候,是偏向锁; | |
当多个线程访问,但不是同时访问,这时候锁升级为轻量级锁; | |
当多个线程同时访问,这时候升级为重量级锁。 | |
所以在并发不是很严重的情况下,使用Synchronized是可以的。 | |
不过Synchronized有局限性,比如不能设置锁超时,不能通过代码释放锁。 | |
ReentranLock 可以通过代码释放锁,可以设置锁超时。 | |
高并发下,Synchronized、ReentranLock 效率低, | |
因为同一时刻只有一个线程能进入同步代码块, | |
如果同时有很多线程访问,那么其它线程就都在等待锁。 | |
这个时候可以使用并发包下的数据结构, | |
例如ConcurrentHashMap | |
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html | |
,LinkBlockingQueue | |
https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/LinkedBlockingQueue.html, | |
以及原子性的数据结构如:AtomicInteger | |
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicInteger.html。 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment