一、并发编程出现的问题:
1. 可见性问题
一个线程正在执行操作,然后另一个线程对其值进行修改,但是第一个线程并不能及时看到修改后的值。就出现了可见性问题。
2. 原子性问题(多个线程、有共享变量)
i++并不是原子性操作。
比如说做自增操作,自增操作并不是一个原子性操作,当多个线程同时执行的时候,就会出现问题,导致结果不正确
3. 有序性问题
程序中代码的执行顺序,java会在编译和运行时会对代码进行优化,导致程序最终执行顺序不一定就是我们编写代码时的顺序。
二、Synchronized特性:
1. 原子性
2. 可见性
一个线程对共享变量进行修改,另外一个线程立即得到修改后的最新值
3. 有序性
4. 可重入性
5. 不可中断性
sunchronized和lock的区别
ReentrantLock
三、CAS
四、锁优化
1. 偏向锁
适用于一个线程反复进入同步代码块
一个线程反复进入同步代码块,锁就偏向他。如果有线程竞争,就要撤销该锁,升级为轻量级锁。
2. 轻量级锁
适用于多线程交替执行同步块的情况。
在特定情况下可以节省性能消耗。
3. 自旋锁:不转换线程状态,多做几次尝试
当一个线程拿到锁执行同步代码块的时候,其他线程就会被阻塞,但是同步代码块里面执行的代码有可能会很快。但是别的线程状态转换的开销太大,耗费多余的资源。此时就让她重试几次。
4. 重量级锁:阻塞和唤醒
线程的阻塞和唤醒需要CPU从用户态转换为核心态,给系统的并发性能带来很大压力。
五、平时写代码如何对synchronized优化
降低锁的粒度,比如不要把…class作为锁。
hashtable的增删改查的方法上全加上了Synchronized锁,