资讯专栏INFORMATION COLUMN

解决方法一:线程安全问题的方法

aboutU / 2010人阅读

摘要:卖票案例出现了线程安全问题卖出了不存在的票和重复的票解决线程安全问题的一种方案使用同步代码块格式锁对象可能会出现线程安全问题的代码访问了共享数据的代码注意通过代码块中的锁对象可以使用任意的对象但是必须保证多个线程使用的锁对象是同一个锁对象作


package com.itheima.demo07.Synchronized;
/*

卖票案例出现了线程安全问题
卖出了不存在的票和重复的票

解决线程安全问题的一种方案:使用同步代码块
格式:
    synchronized(锁对象){
        可能会出现线程安全问题的代码(访问了共享数据的代码)
    }

注意:
    1.通过代码块中的锁对象,可以使用任意的对象
    2.但是必须保证多个线程使用的锁对象是同一个
    3.锁对象作用:
        把同步代码块锁住,只让一个线程在同步代码块中执行

*/
public class RunnableImpl implements Runnable{

//定义一个多个线程共享的票源
private  int ticket = 100;

//创建一个锁对象
Object obj = new Object();

//设置线程任务:卖票
@Override
public void run() {
    //使用死循环,让卖票操作重复执行
    while(true){
       //同步代码块
        synchronized (obj){
            //先判断票是否存在
            if(ticket>0){
                //提高安全问题出现的概率,让程序睡眠
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                //票存在,卖票 ticket--
                System.out.println(Thread.currentThread().getName()+"-->正在卖第"+ticket+"张票");
                ticket--;
            }
        }
    }
}

}
package com.itheima.demo07.Synchronized;

/*

模拟卖票案例
创建3个线程,同时开启,对共享的票进行出售

*/
public class Demo01Ticket {

public static void main(String[] args) {
    //创建Runnable接口的实现类对象
    RunnableImpl run = new RunnableImpl();
    //创建Thread类对象,构造方法中传递Runnable接口的实现类对象
    Thread t0 = new Thread(run);
    Thread t1 = new Thread(run);
    Thread t2 = new Thread(run);
    //调用start方法开启多线程
    t0.start();
    t1.start();
    t2.start();
}

}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75606.html

相关文章

  • 如何看待Spring下单例模式与线程安全矛盾

    摘要:线程安全问题都是由全局变量及静态变量引起的。常量始终是线程安全的,因为只存在读操作。局部变量是线程安全的。有状态对象,就是有实例变量的对象,可以保存数据,是非线程安全的。 前言 有多少人在使用Spring框架时,很多时候不知道或者忽视了多线程的问题?   因为写程序时,或做单元测试时,很难有机会碰到多线程的问题,因为没有那么容易模拟多线程测试的环境。那么当多个线程调用同一个bean的时...

    dinfer 评论0 收藏0
  • 如何看待Spring下单例模式与线程安全矛盾

    摘要:线程安全问题都是由全局变量及静态变量引起的。常量始终是线程安全的,因为只存在读操作。局部变量是线程安全的。有状态对象,就是有实例变量的对象,可以保存数据,是非线程安全的。 前言 有多少人在使用Spring框架时,很多时候不知道或者忽视了多线程的问题?   因为写程序时,或做单元测试时,很难有机会碰到多线程的问题,因为没有那么容易模拟多线程测试的环境。那么当多个线程调用同一个bean的时...

    刘永祥 评论0 收藏0
  • 1、多线程安全问题 2、等待唤醒机制

    摘要:线程操作共享数据的安全问题线程操作共享数据的安全问题如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。唤醒全部可以将线程池中的所有线程都唤醒。 01线程操作共享数据的安全问题 *A:线程操作共享数据的安全问题 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。 程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。 02...

    罗志环 评论0 收藏0
  • 单例模式五种实现

    摘要:前言文章介绍了单例模式五种实现的方式,分别是懒汉,饿汉,静态内部类,双重检验锁以及枚举实现方式,并主要关心加载时机以及线程安全。 前言 文章介绍了单例模式五种实现的方式,分别是懒汉,饿汉,静态内部类,双重检验锁以及枚举实现方式,并主要关心加载时机以及线程安全。首先,通俗点讲,饿汉就是这个类还没被使用到的时候,实例已经创建好了;而懒汉是使用到的时候才创建对应的实例。线程安全方面主要考虑实...

    Jrain 评论0 收藏0

发表评论

0条评论

aboutU

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<