• java多线程之线程安全


    线程安全和非线程安全是多线程的经典问题,非线程安全会在多个线程对同一个对象并发访问时发生。

    注意1:

    非线程安全的问题存在于实例变量中,如果是方法内部的私有变量,则不存在非线程安全问题。

    实例变量是对象的各个方法共有的,静态变量是类的所有对象共有的,这些变量在多线程情况下,就需要考虑线程安全问题。

    注意2:

    如果是并发访问,只读不写,那么也不会有非线程安全问题,如果涉及到并发的读写,则需要考虑线程安全问题。

    public class Var {
        private Integer count;
    
      public Integer updateCount(Integer count) throws InterruptedException {
          this.count=count;
          Thread.sleep(1000);
          return this.count;
      }
    }
    
    public class ThreadA extends  Thread{
        private Var var;
    
        public ThreadA(Var var) {
            this.var = var;
        }
    
        @Override
        public void run() {
            try {
                Integer newCount = var.updateCount(200);
                System.out.println("set=200;return="+newCount);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
    public class ThreadB extends Thread {
        private Var var;
    
        public ThreadB(Var var) {
            this.var = var;
        }
    
        @Override
        public void run() {
            try {
                Integer newCount = var.updateCount(100);
                System.out.println("set=100;return="+newCount);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
    
    /**
     * Created by wangbin10 on 2018/7/11.
     * 输出:
     *set=100;return=100
     *set=200;return=100
     */
    public class Run {
        public static void main(String[] args) {
            Var var=new Var();
            ThreadA a = new ThreadA(var);
            ThreadB b = new ThreadB(var);
            a.start();
            b.start();
        }
    }

    解决办法很简单,给updateCount加锁:

    public class Var {
        private Integer count;
    
      synchronized public Integer updateCount(Integer count) throws InterruptedException {
          this.count=count;
          Thread.sleep(1000);
          return this.count;
      }
    }

    这个时候输出就正常了。

  • 相关阅读:
    top、ps -ef、ps aux的区别及内容详解
    img2pdf 报 img2pdf.AlphaChannelError: Refusing to work on images with alpha channel 的解决方案
    Scrapy命令行调用传入自定义参数
    查询Linux CPU架构
    LeetCode 216. 组合总和 III | Python
    LeetCode 40. 组合总和 II | Python
    LeetCode 39. 组合总和 | Python
    LeetCode 77. 组合 | Python
    LeetCode 347. 前 K 个高频元素 | Python
    LeetCode 107. 二叉树的层次遍历 II | Python
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/9293582.html
Copyright © 2020-2023  润新知