zoukankan      html  css  js  c++  java
  • 实例变量时所导致的线程安全问题

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

  • 相关阅读:
    Codeforces 1000C Covered Points Count
    Array类型
    Object对象
    变量、作用域与内存
    window.onload 方法脚本
    页面的性能优化
    node属性
    JavaScript图片
    DOM节点
    canvas象棋 画图
  • 原文地址:https://www.cnblogs.com/cing/p/8933734.html
Copyright © 2011-2022 走看看