线程安全

单线程是不会出现线程安全问题的

多线程程序没有访问共享数据,不会产生问题

多线程访问共享的数据就会产生线程安全问题

//实现买票案例

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

//使用线程安全的一种方案:使用同步代码块

/* 格式:

          synchronized(同步锁){

                     需要同步操作的代码

         }

注意:同步代码快中的锁对象可以是任意的对象,但是我们必须保证多个线程使用的锁对象是同一个 锁对象作用;把同步代码快锁住,只让一个线程在同步代码块中执行 */

首先创建RunnableImp类
package demo06线程安全; //实现买票案例 //卖票出现了线程安全问题:卖出了不存在的票和重复的票 //使用线程安全的一种方案:使用同步代码块
/* 格式; synchronized(同步锁){ 需要同步操作的代码 }
注意:同步代码快中的锁对象可以是任意的对象,但是我们必须保证多个线程使用的锁对象是同一个 锁对象作用;把同步代码快锁住,只让一个线程在同步代码块中执行 */
public class RunnableImp 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(); }
System.out.println(Thread.currentThread().getName()+"---正在卖票"+ticket+"张票");
ticket--; } } } } }
在创建Ticket类:
package demo06线程安全; //模拟买票案例,对共享的票进行出售 public class Ticket { public static
void main(String[] args) { //创建接口的实现类对象 RunnableImp run =new RunnableImp();
//创建Thread类对象,构造方法中传递Runnable接口对象 Thread t0=new Thread(run); Thread t1=new
Thread(run); Thread t2=new Thread(run); //开启线程 t0.start(); t1.start();
t2.start(); } }
结果:

技术
©2019-2020 Toolsou All rights reserved,
C语言——qsort函数CSS实现溢出显示省略号网络层协议——ICMP协议C语言小游戏-俄罗斯方块Qt入门教程【基础控件篇】QCalendarWidget日历控件用python来控制wifi连接vue中input框只能输入数字Python内置函数C语言数据结构-顺序表删除重复V2.0.0abaqus质量缩放系数取值_ABAQUS的质量缩放