实例变量时所导致的线程安全问题

当有多个线程共享同一数据时,可能导致数据不一致问题,也就是常见的银行存款取款问题,如果多个线程同时处理某一账户上的钱,则可能导致a取了100,b取了100,而钱只少了100的情况,当然还有更多数据不一致的情况发生。示例代码如下:

public class SynchronizedThread extends Thread{
    private int cnt = 5;
    public void run() {
        super.run();
        cnt--;
        System.out.println("由" + this.currentThread().getName() + "计算, cnt = " + cnt);
    }
}
public class MainTest {

    public static void main(String[] args) {
        SynchronizedThread sThread = new SynchronizedThread();
        //这种new方式,表示将sThead的线程委托给a线程来执行。即a.start()就是执行sThread.start()。
        Thread a = new Thread(sThread, "A");
        Thread b = new Thread(sThread, "B");
        Thread c = new Thread(sThread, "C");
        Thread d = new Thread(sThread, "D");
        Thread e = new Thread(sThread, "E");
        a.start();
        b.start();
        c.start();
        d.start();
        e.start();
    }

}

运行结果:

由B计算, cnt = 3
由C计算, cnt = 0
由A计算, cnt = 3
由E计算, cnt = 1
由D计算, cnt = 2

由于线程执行的随机性,以及多个线程共享同已数据的特性,导致了数据不一致问题。

解决办法:在run()方法前面加上synchronized关键字。也就是对run()方法进行上锁。

原文地址:https://www.cnblogs.com/cing/p/8933734.html