当有多个线程共享同一数据时,可能导致数据不一致问题,也就是常见的银行存款取款问题,如果多个线程同时处理某一账户上的钱,则可能导致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()方法进行上锁。