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

    导致安全问题的出现的原因:

    多个线程访问出现延迟。

    线程随机性。

    注:线程安全问题在理想状态下,不容易出现,但一旦出现对软件的影响是非常大的。

    我们可以通过Thread.sleep(long time)方法来简单模拟延迟情况。

    我的总结:

    当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行。导致共享数据的错误。

     

    解决办法:

    对多条操作共享数据的语句,只能让一个线程都执行完。在执行过程中,其他线程不可以参与执行。

    Eg:在前面的卖票例子上,在每卖票的前面加上模拟延时的语句!

    package july7;

    class SellDemo implements Runnable{

        private int num = 50;

        @Override

        public void run() {

            for (int i = 0; i < 200; i++) {

           

                    if(num > 0){ 

                        try {

                        //因为它不可以直接调用getName()方法,所以必须要获取当前线程。

                            Thread.sleep(10);

                        } catch (InterruptedException e) {

                            e.printStackTrace();

                        }

                    System.out.println(Thread.currentThread().getName()+"卖出第"+num--+"张票!");

                }

            }

        }

    }

    public class Demo3 {

        public static void main(String[] args) {

            SellDemo s = new SellDemo();

            new Thread(s,"A").start();

            new Thread(s,"B").start();

            new Thread(s,"C").start();

        }

    }

    输出:这样的话,会出现买了第0,甚至-1张票的情况!

  • 相关阅读:
    Tree 点分治
    [LUOGU4149][IOI2011]Race
    [BZOJ2152] 聪聪可可
    [LUOGU3413] SAC#1
    [JZOJ5776]【NOIP2008模拟】小x游世界树
    [JZOJ5775]【NOIP2008模拟】农夫约的假期
    [JZOJ5781]【NOIP提高A组模拟2018.8.8】秘密通道
    [JZOJ5778]【NOIP提高A组模拟2018.8.8】没有硝烟的战争
    [JZOJ5773]【NOIP2008模拟】简单数学题
    [JZOJ5459]【NOIP2017提高A组冲刺11.7】密室
  • 原文地址:https://www.cnblogs.com/fanweisheng/p/11132347.html
Copyright © 2011-2022 走看看