java多线程使用synchronized实现线程同步

在多线程环境下,可能会遇到资源竞争导致的问题,如票务系统中的重复售票或银行取款的余额异常。文章通过示例解释了如何使用synchronized关键字来实现线程同步,确保在同一时刻只有一个线程能访问共享资源,从而解决这些问题。通过对取款操作进行同步,防止了余额不足仍能取款或同一笔钱被多次取出的错误。

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

在初学多线程的时候我们可能会遇到如:三个售票窗口一起卖票最后多卖的情况或是售出同一张票,或是遇到一个账号同时银行取钱到最后余额不足还能取成的情况或是取同一笔钱,此时我们就要学会使用synchronized实现了线程同步。

在未使用时部分错误如下

 此时只需要用

synchronized (this) {}将取钱的代码包裹起来就不会在出错(休眠可包括也可不包括)

 使用了synchronized实现了线程同步,之后就不会出现多取的情况

//            这里使用了synchronized实现了线程同步
//            当多个线程执行到这里的时候,就会争夺this对象锁
//            那个线程争夺到(获取)this对象锁,就执行synchronized代码块,执行完后,会释this对象锁
//            争夺不到this对象锁,就blocked,准备继续争夺
//            this对象锁是非公平锁
 public static void main(String[] args) {
        T t = new T();
        Thread thread1 = new Thread(t);
        thread1.setName("t1");
        Thread thread2 = new Thread(t);
        thread2.setName("t2");
        thread1.start();
        thread2.start();
    }
}

//编程取款的线程
//1.因为这里涉及到多个线程共享资源,所以我们实现Runnable方式
class T implements Runnable {
    private int money = 10000;

    @Override
    public void run() {
        while (true) {
//            这里使用了synchronized实现了线程同步
//            当多个线程执行到这里的时候,就会争夺this对象锁
//            那个线程争夺到(获取)this对象锁,就执行synchronized代码块,执行完后,会释放this对象锁
//            争夺不到this对象锁,就blocked,准备继续争夺
//            this对象锁是非公平锁
            synchronized (this) {
                if (money < 1000) {
                    System.out.println("余额不足");
                    break;
                }
                money -= 1000;
                System.out.println(Thread.currentThread().getName() + "取出了1000当前余额为" + money);
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值