Skip to content

Instantly share code, notes, and snippets.

@Hasiy
Last active March 25, 2020 05:22
Show Gist options
  • Save Hasiy/ce301e1dc742a4a6e443d3aea7781e94 to your computer and use it in GitHub Desktop.
Save Hasiy/ce301e1dc742a4a6e443d3aea7781e94 to your computer and use it in GitHub Desktop.
多线程并发问题
当只有一个线程写,其它线程都是读的时候,可以用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