多线程和并发(二)使用synchronized 让线程按顺序执行

一.先来说说线程为什么执行不按顺序执行

由于在同一个进程内存在多个线程,线程都想占有着稀缺的CPU资源去完成任务和工作(有一部分资源是所有线程共享的),但是cpu资源到底分配谁呢?是这样的,多个线程共同竞争CPU时,存在多种分配策略,但是每种策略下每个线程只是在很短的时间内占有cpu,这段时间就是时间片,到了线程的时间片,就开始执行任务,一旦时间片结束,资源立马被释放,任务也停止,别的线程获得资源,等下一次时间片到来时,再去执行任务。

来看一下测试,创建三个线程分别输出A,B,C:

第一次运行结果:

Thread-2C
Thread-1B
Thread-0A
第二次运行结果:

Thread-1B
Thread-0A
Thread-2C
第三次运行结果:

Thread-0A
Thread-2C
Thread-1B
 

很明显执行顺序一直在变化,那么有的场景下我们需要让线程顺序执行,该怎么实现呢?

二,什么是synchronized 

Java中synchronized 实现了同步机制,synchronized 可以修饰方法,也可以修饰代码块synchronized (Object)。当方法或者属性被synchronized 修饰时,保证在同一时刻只能有一个线程对其进行操作,有以下规则:

1.另一个线程想要对被synchronized 修饰的属性或者方法必须等当前线程操作完成

2.另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。

3.当前线程的其他synchronized 代码块也不可以被其他线程访问

很典型的一个例子就是:比如有一栋大楼只有有一串钥匙,别人得到这串钥匙的话才可以去打开,你必须等别人给你钥匙才可以去打开其中的一个房间,假如你想去501,钥匙在别人手里所以501无法进去,同样没有钥匙,被锁着的502也进不去。

三.synchronized 的好与坏

很明显,被synchronized 修饰后的操作会作为一个整体去完成,也就是保证了原子性

但也正因为一直占用着锁,别的线程想要操作只能一直等待,性能下降

四,实现线程的顺序执行

已创建三个线程不变,在测试类上修改代码即可:

在控制台已经看到了顺序执行后的结果 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值