Java多线程同步 synchronized 关键字的使用

代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D)运行完这个方法后再运行此线程A,没有的话,直接运行它包括两种用法:synchronized 方法和 synchronized 块。

JAVA多线程买票案例

synchronized 同步

用synchronized 块实现同步

    public static void main(String[] args) { // runable对象的属性代表了一共多少张票 // runable对象的run方法实现了买票的动作 Runnable runnable = new Runnable() { private int count = 100; @Override public void run() { while (true) { synchronized (this) { // synchronized 的对象如果 Thread currentThread = Thread.currentThread(); if (count > 0) { out.println(currentThread.getName()+ " => " + (101 - count) + "张车票"); --count; } else { break; } } } } }; // 开启100个线程模拟100个售票口 for (int i = 0; i < 100; i++) { new Thread(runnable).start(); } }

用synchronized 方法 块实现同步

    public static void main(String[] args) { // runable对象的属性代表了一共多少张票 // runable对象的run方法实现了买票的动作 Runnable runnable = new Runnable() { private int count = 100; @Override public void run() { while (true) { if (synchronizedMethod()) break; } } public synchronized boolean synchronizedMethod() { Thread currentThread = Thread.currentThread(); if (count > 0) { out.println(currentThread.getName() + " => " + (101 - count) + "张车票"); --count; return false; } return true; } }; // 开启100个线程模拟100个售票口 for (int i = 0; i < 100; i++) { new Thread(runnable).start(); } }

同步过后的代码输出如下

Thread-0 => 1张车票
Thread-0 => 2张车票
Thread-0 => 3张车票
Thread-4 => 4张车票
Thread-4 => 5张车票
Thread-2 => 6张车票
....
....
Thread-34 => 98张车票
Thread-34 => 99张车票
Thread-34 => 100张车票

非同步

synchronized 块

把同步块删除

synchronized 方法

把 ynchronized 关键字删除

输出结果如下

Thread-0 => 1张车票
Thread-0 => 2张车票
Thread-2 => 1张车票
Thread-2 => 4张车票
Thread-2 => 5张车票
Thread-2 => 6张车票
Thread-2 => 7张车票
Thread-4 => 7张车票
Thread-1 => 1张车票
Thread-1 => 10张车票
Thread-1 => 11张车票
Thread-1 => 12张车票
Thread-1 => 13张车票

可以看出有一个以上的线程访问同一张票
显然是不合理的

转载于:https://www.cnblogs.com/cxxjohnson/p/5979105.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值