请修改代码如下所示:

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);
            }
        }
    }
}

修改说明:

  1. 在卖票操作方法sale()中,使用while循环来判断是否有票,以解决虚假唤醒问题。
  2. 虚假唤醒问题是指在多线程环境下,当有多个线程等待同一个条件变量时,即使没有其他线程发出通知,线程也可能从等待状态中被唤醒。所以在判断是否有票时,应该使用while循环来再次检查条件,确保没有票时线程继续等待
请修改代码打印出block状态package comjucTest;class Create1 extends Thread private static Object lock = new Object; Override public void run synchronized lock 线程执行的代码逻辑 Sys

原文地址: https://www.cveoy.top/t/topic/isAK 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录