程序员

锁的优化及注意事项

避免死锁,减少锁的粒度,锁分离

一、减少锁持有的时间;

二、减少锁的粒度;

三、锁分离;

四、锁粗化;

五、ThreadLocal的使用;

ThreadLocal是解决线程安全问题一个很好的思路,它通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。在很多情况下,ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性。
在同步机制中,通过对象的锁机制保证同一时间只有一个线程访问变量。这时该变量是多个线程共享的。

ThreadLocal则从另一个角度来解决多线程的并发访问。ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。

六、无锁

与众不同的并发策略:比较交换(CAS)。在高并发的情况下,它比有锁的程序拥有更好的性能;它天生就是死锁免疫的;

JDK并发包中有一个atomic包,里面实现了一些直接使用CAS操作的线程安全的类型。

AtomicInteger,与Integer不同,值是可变的,并且是线程安全的,对其进行的任何修改,都是用CAS指令进行的。

AtomicLong,AtomicBoolean,AtomicReference。

比用锁具有更好的性能。

七、关于类加载器

应用程序的类由App Loader加载,而系统核心类,如rt.jar中的类由Bootstrap类加载器加载。

八、无锁对象引用:

AtomicReference

AtomicStampedReference;带有时间戳的对象引用

AtomicIntegerArray

AtomicLongArray

AtomicReferenceArray

让普通变量也享受原子操作:AtomicIntegerFieldUpdater

AtomicLongFieldUpdater

AtomicReferenceFieldUpdater