先创建RunnableImp类:
package demo08线程安全静态同步方法; //实现买票案例 //卖票出现了线程安全问题:卖出了不存在的票和重复的票
//使用线程安全的一种方案:使用同步方法 /* 使用步骤: 1.把访问的共享数据的代码块抽取出来,放到一个方法中
2.在方法中添加一个synchornized修饰符 格式:定义方法格式 修饰符 synchornized 返回类型 方法名(参数列表){
可能出现问题线程安全代码 } */ public class RunnableImp implements Runnable { //定义一个多线程共享的票源
private static int ticket=100; //创建一个锁对象 Object obj=new Object(); //定义线程任务:买票
@Override public void run() { //使用死循环让卖票重复执行 while(true){ payTicketStatic(); }
} /* 定义一个静态同步方法: 同步方法也会把方法内部的代码锁住,只让一个方法执行 锁对象不是this
this是创建对象之后产生的,静态方法优于对象,静态方法的锁对象是本类的class属性--class文件对象 */ public static
/*synchronized*/ void payTicketStatic(){ //判断票是否存在
synchronized(RunnableImp.class){ if(ticket>0){ //为了提高安全问题出现的次数。让程序睡眠一下 try {
Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); }
System.out.println(Thread.currentThread().getName()+"---正在卖票"+ticket+"张票");
ticket--; } } } }
再创建Ticket类:
package demo08线程安全静态同步方法; //模拟买票案例,对共享的票进行出售 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的质量缩放