线程争抢:当多个线程同时争抢共享资源,并且修改共享资源的时候。就极其容易发生线程争抢的问题。线程争抢也同样会导致脏数据的产生。
线程争抢:
package com.ydlclass.thread;
public class ConflictOfThread {//线程争抢
//为了解决线程争抢的问题,我们使用同步代码块关键字修饰可能会发生线程争抢的地方;
private static int count = 0;
public synchronized static void adder(){//关键字synchronized的作用是:线程a在使用共享的数据时
//其他线程不可使用,除非此线程使用完毕
count++;
}
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(()->{
for (int i = 0; i < 10000; i++) {
adder();
}
});
Thread t2 = new Thread(()->{
for (int i = 0; i < 10000; i++) {
adder();
}
});
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("最后的结果为:" + count);
//按理说应该是2万,但是由于线程争抢的存在,线程t1在读取完count的存在并自增1后还没来得及写入内存,线程t2读取count依旧是1,
//所以即使线程2自增了并且写入了主线程的内存之中,但是最后的效果依旧是只自增了一次。
//最后的结果一般是小于2万的,这就是线程争抢。
}
}