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

    多线程访问共享数据会产生安全问题,比如下面的案例,创建了三个线程,访问共享的数据,会出现安全问题

    Runable实现类

    当ticket的值大于0,run方法里输出ticket的值

    package cn.zhuobo.day12.aboutMultithreading;
    
    public class RunableImpl implements Runnable {
        private int ticket = 100;
        @Override
        public void run() {
            while(true) {
                if(ticket > 0) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + " is selling ticket number--> " + ticket);
                    ticket--;
                }
            }
        }
    }
    
    

    创建多个线程

    创建一个Runable实现类的对象,用这个对象构造三个Thread对象,开启三个线程,这三个线程是共同访问共享数据ticket的,根据结果发现出现线程安全问题。三个线程一起抢夺CPU的执行权,当某个线程的到CPU,执行run方法,但是仅仅值执行到了某个语句就失去了执行权,也即是任何一个线程在访问共享数据的时候都有可能发生线程切换,再切换回来时,就会得到错误数据。比如0号线程应该得到的ticket值是88,但是,在得到这个数据之前CPU切换了进程,另一个进程将共享数据ticket改变了变成了87,那么0号线程就得到了错误的数据。

    package cn.zhuobo.day12.aboutMultithreading;
    
    public class RunableDemo {
        public static void main(String[] args) {
            RunableImpl run = new RunableImpl();
            Thread t1 = new Thread(run);
            Thread t2 = new Thread(run);
            Thread t3 = new Thread(run);
    
            t1.start();
            t2.start();
            t3.start();
        }
    }
    
    

    执行的结果,多个线程会输出同一个数值


    这种线程安全问题应该得到解决,可以通过让一个线程在访问共享数据的时候,无论CPU是否切换线程都要保证在访问期间不让其他线程访问共享数据,等待该线程访问完毕其他线程才可以访问这个共享数据

  • 相关阅读:
    [转]SQLSERVER 18056 错误
    【转】 Windows控制台上的UTF8支持
    无法访问共享解决方案之一
    performselectoronmainthread
    iphone开发多线程
    iPad app应用开发系列文章之三 -- iOS的多核编程和内存管理
    ObjectiveC中一种消息处理方法performSelector: withObject:
    UIView你知道多少
    NSBundle介绍
    Blocks,注意
  • 原文地址:https://www.cnblogs.com/zhuobo/p/10640033.html
Copyright © 2011-2022 走看看