zoukankan      html  css  js  c++  java
  • 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;
      }
    }

    这个时候输出就正常了。

  • 相关阅读:
    心慌慌
    辛苦了
    [转]家庭长寿秘方:夫妻关系之守则。
    无题
    浮躁
    [转]樱木花道9大缺点
    一票难求
    Excel录入数据,自动记录当前时间点
    Excel数据透视表基本使用
    linux下tomcat7虚拟目录配置
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/9293582.html
Copyright © 2011-2022 走看看