• 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;
      }
    }

    这个时候输出就正常了。

  • 相关阅读:
    acm课程练习2--1005
    acm课程练习2--1003
    [ZJOI2010]网络扩容
    [ZJOI2009]狼和羊的故事
    [FJOI2007]轮状病毒
    [NOIP2016提高组]换教室
    [NOIP2016提高组]愤怒的小鸟
    [NOIP2009提高组]最优贸易
    [洛谷P2245]星际导航
    [NOIP2013提高组]货车运输
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/9293582.html
Copyright © 2020-2023  润新知