多线程(十一)线程安全介绍

什么是线程安全问题?

当多线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据数据冲突问题。但是做读的操作时是不会发生数据冲突问题

需求如下:100张车票 ,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。

package com.zuojie;

/**
 * @author:zuojie
 */

public class ThreadTrain implements Runnable{
    //火车票总数
    private int count=100;
    @Override
    public void run() {
        while(count>0){
            try {
                Thread.sleep(40);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+",出售第"+(100-count+1)+"张票");
            count--;
        }

    }
}
package com.zuojie;

/**
 * 什么是线程不安全
 * 当多个线程同时操作一个共享的全局变量,全局变量可能受到其他线程的干扰
 * 功能描述:(模拟线程不安全问题)
 * @author:zuojie
 */

public class ThreadDemo {

    public static void main(String [] args){
        //线程类一定要是一个实例
        ThreadTrain threadTrain=new ThreadTrain();
        //1.创建两个线程
        Thread t1=new Thread(threadTrain);
        Thread t2=new Thread(threadTrain);
        t1.start();
        t2.start();
    }

}

结果如下:出现了101张票这就是线程安全问题。

那么线程安全问题怎么解决?可以使用synchronized jdk1.5并发包lock

代码修改如下:

package com.zuojie;

/**
 * @author:zuojie
 */

public class ThreadTrain implements Runnable{
    //火车票总数
    private int count=100;

    private Object object=new Object();
    @Override
    public void run() {
        while(count>0){
            try {
                Thread.sleep(40);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (object){
                if(count>0) {
                    System.out.println(Thread.currentThread().getName() + ",出售第" + (100 - count + 1) + "张票");
                    count--;
                }
            }

        }

    }
}
package com.zuojie;

/**
 * 什么是线程不安全
 * 当多个线程同时操作一个共享的全局变量,全局变量可能受到其他线程的干扰
 * 功能描述:(模拟线程不安全问题)
 * @author:zuojie
 */

public class ThreadDemo {

    public static void main(String [] args){
        //线程类一定要是一个实例
        ThreadTrain threadTrain=new ThreadTrain();
        //1.创建两个线程
        Thread t1=new Thread(threadTrain);
        Thread t2=new Thread(threadTrain);
        t1.start();
        t2.start();
    }

}

这时候我们还得考虑一个问题 在分布式的情况下 集群的情况下 我们怎么保证线程安全?

可以一起加群探讨群号:971075418

猜你喜欢

转载自blog.csdn.net/OnlyoneFrist/article/details/89165617
今日推荐