小白写作业发着玩,别当真
下面进入主题
package cn.ticket;
public class SellTicket implements Runnable {
//设置票张
private int tickets = 100;
//创建obj对象
private Object obj = new Object();
@Override
public void run() {
while (true) {
//同步代码块格式
synchronized (obj) {
if (tickets > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");
// System.out.println("你在"+Thread.currentThread().getName()+"购买了一张票");
//每购买一次-1
tickets--;
System.out.println("目前还售有" + tickets + "票");
} else {
System.out.printf("没票了");//存在问题:循环了三次
break;
}
}
}
}
}
package cn.ticket;
public class SellTicketDemo {
public static void main(String[] args) {
//创建SellTicket类的对象
SellTicket ticket = new SellTicket();
//创建三个线程
Thread w1 = new Thread(ticket,"窗口1");
Thread w2 = new Thread(ticket,"窗口2");
Thread w3 = new Thread(ticket,"窗口3");
//启动线程
w1.start();
w2.start();
w3.start();
//设置线程优先级
w3.setPriority(1);
}
}
在编译时期发现一个错误
1.相同的票出现了多次
2.出现了负数的票
原因:
1.线程执行的随机性导致的,可能在卖票过程中丢失CPU的执行权,导致出现问题。
2.在最后一个else的打印没票了依然打印三次(未解决)
解决:
1.同步代码块格式
synchronized(任意对象) {
多条语句操作共享数据的代码
}
见第一张图片的注释
同步代码块的弊端于好处
a) 好处:解决了多线程的数据安全问题。
b)弊端:当线程很多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的运行效率。
以上是本次文章全部内容
小白第一次发博客
大佬勿喷,希望给点建议以及解决办法