zoukankan      html  css  js  c++  java
  • java多线程安全的问题

    多线程中一定会遇到线程安全的问题,也就是在同一时间N条线程操作了同一变量,这个变量也叫做共享变量

    举例:(错误的示范)

      设计一个投票系统,多个人可以对同一个的票数进行投票,下面看具体代码:

    代码:

    /**
     * 投票Demo 错误示范
     */
    public class Test01 extends Thread {
    
        //小明的起始票数为0
        int count = 0;
    
        @Override
        public void run() {
            super.run();
            count++;
            System.out.println(this.currentThread().getName() + "投完票之后,小明的票数增加到了:" + count);
        }
    
        public static void main(String[] args) {
            Test01 test01 = new Test01();
    
            Thread a = new Thread(test01, "小红");
            Thread b = new Thread(test01, "小亮");
            Thread c = new Thread(test01, "小白");
            Thread d = new Thread(test01, "小黑");
            a.start();
            b.start();
            c.start();
            d.start();
    
        }
    
    }

    看代码貌似没什么问题,但是见到打印的语句就会发现问题了:

    小红投完票之后,小明的票数增加到了:2
    小亮投完票之后,小明的票数增加到了:2
    小白投完票之后,小明的票数增加到了:3
    小黑投完票之后,小明的票数增加到了:4

    明明小红投完票之后,小明的票应该是1,但是却变为了2,这就出现了多线程数据安全的问题,很容易发生共享数据错乱,要想解决这个办法,就应该使用synchronized来解决了。

    注意看下面代码的变化:

    /**
     * 投票Demo 错误示范
     */
    public class Test01 extends Thread {
    
        //小明的起始票数为0
        int count = 0;
    
        //使用synchronized修饰之后就不会出现共享数据安全问题了
        @Override
        synchronized public void run() {
            super.run();
            count++;
            System.out.println(this.currentThread().getName() + "投完票之后,小明的票数增加到了:" + count);
        }
    
        public static void main(String[] args) {
            Test01 test01 = new Test01();
    
            Thread a = new Thread(test01, "小红");
            Thread b = new Thread(test01, "小亮");
            Thread c = new Thread(test01, "小白");
            Thread d = new Thread(test01, "小黑");
            a.start();
            b.start();
            c.start();
            d.start();
    
        }
    
    }
    synchronized可以在任意方法和对象上面上锁,加锁这段代码称为“临界点”或者“互斥区”

    到这里就可以解决多线程数据安全的问题了,这种问题在工作中是很常见的,一定要注意。

    
    
    
  • 相关阅读:
    FusionCharts ScrollColumn2D图
    Java Web项目部署Tomcat运行出错
    Eclipse部署Java Web项目到Tomcat出错
    JavaScript过滤特殊字符
    pl/sql 在一个程序块里打印日志输出到表格
    Java中过滤出字母、数字和中文的正则表达式
    pl/sql 程序块里打印问题
    C++函数的Boost内存池性能介绍
    boost内存池的使用介绍
    内存管理 Boost::singleton_pool
  • 原文地址:https://www.cnblogs.com/itiande/p/9518826.html
Copyright © 2011-2022 走看看