锁的种类:
synchronize自动锁(最常用) 可以给类、方法、代码块加锁
lock手动锁,只能锁代码块儿,且需要手动加锁解锁,忘记解锁会造成死锁
volatile轻量级锁,不会造成线程阻塞,只能修饰变量,且只能保证变量的修改可见性,无法保证原子性
解决死锁的方法:
1)尽量使用tryLock(long timeout, TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock),设置超时时间,超时可以退出防止死锁。
2)尽量使用java.util.concurrent(jdk 1.5以上)包的并发类代替手写控制并发,比较常用的是ConcurrentHashMap、ConcurrentLinkedQueue、AtomicBoolean等等,实际应用中java.util.concurrent.atomic十分有用,简单方便且效率比使用Lock更高
3)尽量降低锁的使用粒度,尽量不要几个功能用同一把锁
4)尽量减少同步的代码块
悲观锁与乐观锁
悲观锁用于线程冲突率高的场景,用提前加锁保证线程安全
乐观锁用于线程冲突率底的场景,用修改前后版本号是否一致保证线程安全
未完待续
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。