线程争抢:当多个线程同时争抢共享资源,并且修改共享资源的时候。就极其容易发生线程争抢的问题。线程争抢也同样会导致脏数据的产生。

线程争抢:

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万的,这就是线程争抢。
    }
}