请修改代码打印出block状态package comjucTest;class Create1 extends Thread private static Object lock = new Object; Override public void run synchronized lock 线程执行的代码逻辑 Sys
请修改代码如下所示:
package com.juc.Test;
class Create1 extends Thread{
private static Object lock = new Object();
@Override
public void run(){
synchronized (lock) {
// 线程执行的代码逻辑
System.out.println("线程开始执行" + getName() + " " + getState());
try {
Thread.sleep(1000); // 模拟线程执行耗时操作
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程执行结束" + getName() + " " + getState());
}
}
public static void main(String[] args) {
Create1 create1 = new Create1();
System.out.println("线程创建" + create1.getName() + " " + create1.getState());
create1.start();
try {
Thread.sleep(100); // 等待线程开始执行
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程开始执行之后" + create1.getName() + " " + create1.getState());
try {
Thread.sleep(2000); // 等待线程执行结束
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程执行结束之后" + create1.getName() + " " + create1.getState());
}
static class Ticket {
//票数
private int number = 45000;
//操作方法:卖票
public synchronized void sale() {
//判断:是否有票
while(number > 0) { // 使用while循环判断,解决虚假唤醒问题
System.out.println(Thread.currentThread().getName()+" : "+(number--)+" "+number);
}
}
}
}
修改说明:
- 在卖票操作方法
sale()中,使用while循环来判断是否有票,以解决虚假唤醒问题。 - 虚假唤醒问题是指在多线程环境下,当有多个线程等待同一个条件变量时,即使没有其他线程发出通知,线程也可能从等待状态中被唤醒。所以在判断是否有票时,应该使用
while循环来再次检查条件,确保没有票时线程继续等待
原文地址: https://www.cveoy.top/t/topic/isAK 著作权归作者所有。请勿转载和采集!