多线程和并发(二)使用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 修饰后的操作会作为一个整体去完成,也就是保证了原子性

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

四,实现线程的顺序执行

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

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

猜你喜欢

转载自blog.csdn.net/qq_38162448/article/details/81675479