synchronized抢票线程只有一个问题

本文通过一个3线程抢票的例子,深入解析Java中synchronized关键字的使用。首先介绍了将synchronized加在run()方法上导致的线程问题,然后展示了如何修正,将同步代码块放入单独的方法中,避免了资源竞争。最后总结了synchronized的两种形式:同步方法(非静态和静态)及其锁对象的选择。通过实例帮助新手理解多线程同步的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

新手上路

总容易弄出些低级错误。
synchronized写了个3线程抢票发现一直只执行一个

class ticket implements Runnable {
    private int num = 100;

    @Override
    public synchronized void run() {

        while (num >= 0) {
            if (num == 0) {
                break;
            }

            System.out.println("剩余:" + num-- + Thread.currentThread().getName());
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

}

新手不懂,直接run加上synchronied,
synchronied 线程进入 会执行到方法完毕,所以会一直在while 里面循环,然后推出。所以只有一个线程抢完所有的票然后其他线程才会进来。
修改方法 写个synchronized方法 把num – 扔进去

class ticket implements Runnable {
    private int num = 100;

    @Override
    public  void run() {

        while (num >= 0) {
            if (num == 0) {
                break;
            }
            sell();
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    private  synchronized void  sell(){
        System.out.println("剩余:" + num-- + Thread.currentThread().getName());
    }
}

嫌麻烦的 直接

synchronized (this) {
                System.out.println("剩余:" + num-- + Thread.currentThread().getName());
            }

synchronized 的基本使用
1.同步方法(非静态的)的锁可以是this也可以是其他对象,要求是同一对象
2.同步方法(静态的)的锁为当前类的本身。

public class A {
    Object object = new Object();
    
    public void m(){
        synchronized (object){
            
        }
        synchronized (this){
            
        }
    }
    
    public static void n(){
        synchronized (A.class){
            
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值