首页 > 编程语言 >java——线程同步机制——解决线程安全问题——同步代码块

java——线程同步机制——解决线程安全问题——同步代码块

时间:2022-11-20 18:55:47浏览次数:44  
标签:同步 java Thread 代码 线程 new ticket

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

解决线程安全问题——同步代码块

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

解决线程安全问题的一种方案:使用同步代码块
格式:

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();
    }
}
 

标签:同步,java,Thread,代码,线程,new,ticket
From: https://www.cnblogs.com/xiaobaibailongma/p/16909206.html

相关文章

  • Linux下安装Java运行环境
    1.下载java8的包,并上传到服务器/usr/local目录下wget命令是一个从网络上下载文件的自由工具,它支持http协议,https协议和ftp协议。因此我们可以通过wget命令来下载JDK。wge......
  • java注解详解以及如何获取注解的上的信息
    目录一、Java自定义注解详解1.定义注解:2.元注解介绍@Target详细介绍@Relation详细介绍@Documented介绍@Inherited介绍3.注解可用的类型4.默认值限制5.创建一个简单的自定义......
  • Java中使用脚本引擎运行脚本语言
    在Java中运行脚本语言,例如JavaScript。步骤:1、创建脚本引擎管理器ScriptEngineManager2、从管理器中获取一个引擎ScriptEngine3、通过put(key,valu......
  • JAVA接口
    JDK1.8之前接口是接口,类是类。它们是同一层次的概念。接口中没有构造器。接口如何声明:interface在JDK1.8之前,接口中只有两部分内容,(1)常量:固定修饰符:publicstaticfina......
  • JavaWeb笔记
    1.JavaEE项目的三层架构web层                    com.atguigu.web/servlet/controllerservice层         ......
  • jenkins配置从节点后运行报错java.net.ConnectException: Connection timed out: conn
    修改jenkins配置中的ip系统管理-系统配置  修改ip与访问地址相同 ......
  • 28-网络文件共享和实时同步
    NAS存储NAS存储就是存储设备通过标准的网络拓扑结构(比如以太网)添加到一群计算机上。与DAS以及SAN不同,NAS是文件级的存储方法。采用NAS较多的功能是用来进行文件共享。NAS......
  • JAVA学习方法与知识点
       这个时代有很多的朋友都开始选择看看学习学习当下热门的编程语言比如现在的Java这类技术。俗话说的好啊天下熙熙皆为利来,天下攘攘皆为利往,目前大多都是为了高薪工......
  • javascript: 用图片加载演示promise的应用(chrome 107.0.5304.110)
    一,js代码:<html><head><metacharset="utf-8"/><title>测试</title></head><body><imgid="img"src=""/><script>//记录开始时间leta=newDate......
  • 小新学Java9
    一、Object类1.1Object类的toString方法toStringpublicStringtoString()返回该对象的字符串表示。通常,toString方法会返回一个“以文本方式表示”此对象的字......