同步代码块 锁多条语句操作共享数据,可以使用同步代码块实现 ·格式: synchronized(任意对象){ 多条语句操作共享数据的代码 } ·synchronized(任意对象):就相当于给代码加锁了,任意对象就可以看成是一把锁同步的好处和弊端 ·好处:解决了多线程的数据安全问题 ·弊端:当线程很多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的运行效率
package com.d05_duoxiancheng.itheima05;
/*
同步代码块
锁多条语句操作共享数据,可以使用同步代码块实现
·格式:
synchronized(任意对象){
多条语句操作共享数据的代码
}
·synchronized(任意对象):就相当于给代码加锁了,任意对象就可以看成是一把锁同步的好处和弊端
·好处:解决了多线程的数据安全问题
·弊端:当线程很多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的运行效率
*/
public class SellTicket implements Runnable {
private int tickets = 100;
private Object obj = new Object();
@Override
public void run() {
while (true){
//将一段代码锁住,在同一时间只能有一个线程可访问该段代码,且包含的类必须是公共的,只产生唯一的锁
synchronized (obj){
if (tickets>0) {
//对异常进行捕获
try {
//每运行一次线程休眠100毫秒,表达的意思即为卖出一张票窗口需要处理100毫秒
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");
tickets--;
}
}
}
}
}
package com.d05_duoxiancheng.itheima05;
/*
刚才讲解了电影院卖票程序,好像没有什么问题。但是在实际生活中,售票时出票也是需要时间的,所以,在出售一张票的时候,需要一点时间的延迟,接下来我们去修改卖票程序中卖票的动作:
每次出票时间100毫秒,用sleep0方法实现卖票出现了问题
·相同的票出现了多次
·出现了负数的票
问题原因:
·线程执行的随机性导致的,同一张票在休眠时别的窗口也可用该窗口的票,导致多卖
*/
public class SellTicketDemo {
public static void main(String[] args) {
SellTicket st = new SellTicket();
Thread t1 = new Thread(st,"窗口1");
Thread t2 = new Thread(st,"窗口2");
Thread t3 = new Thread(st,"窗口3");
t1.start();
t2.start();
t3.start();
}
}