在多线程中使用共享资源,对共享资源的操作不是原子性,就会导致数据不一致的情况 例如 : index ++ 操作 index ++ 实际上相当于 1. index + 1 2. 将结果赋值 index
主要是由于线程1修改后index值已改变未输出前,cpu将权利交给线程2,线程2继续累加并输出
2.数据重复
主要是由于线程1执行到index +1但是还没赋值index,cpu就将执行权交给线程2
3.超过最大值
当index=499 时线程1和线程2都看到满足条件,线程1将index增加到500后,线程2恢复执行变为501
synchronized 实现同步
每一个对象都与一个monitor相关联,一个monitor的lock的锁只能被一个线程在同一时间获得.
如果monitor的计数器为0,则意味着monitor的lock还没有被获得,某个线程获得之后计数器加1
如果一个monitor的所有权的线程重入,则会导致moniter的计数器再次累加
如果monitor已经被其他线程所拥有,则其他线程再尝试获取所有权时,被陷入阻塞状态,直到monitor计数器变为0,才能再次获取
释放monitor所有权就是将计数器减一,前提是必须拥有所有权
public static class Task implements Runnable{
//这里如果初始化多个任务将使用同一个锁.
private final Object MUTEX = new Object();
publiv void run(){
synchronized(MUTEX){
}
}
}
在 同一个类中的两个方法上加synchronized,导致两个方法共用同一个 this monitor锁,
同样的在同一个类中的两个静态的方法,分别使用 synchronized 进行同步,两个方法被加同样的class 锁
A 持有 R1 等待 R2 , B 持有 R2 等待 R1
2.内存不足
共30M内存,A持有 10 ,B 持有 20 , 都在等待资源
3.一问一答数据交换
4.死循环造成的锁.
5.数据库和文件锁