线程互斥和同步的区别 多个线程可以读一个变量,只有一个线程可以对这个变量进行写,到底要不要加锁?
多个线程可以读一个变量,只有一个线程可以对这个变量进行写,到底要不要加锁?
下面简要解释一下原因:
锁定是因为操作不是原子的。让我们用操作一来解释它。看下面两个图。
我这个操作需要
看上面的第二个图,你能很清楚地理解这个过程吗?
锁定是为了确保上述三个步骤是原子操作。
回到问题上来,只有一个线程要写,没有竞争,所以不需要锁定。
但是,如果你看第一张图片,因为主内存和本地内存的存在
在一个线程写入后,其他线程无法立即看到它。这就是可见性问题。
添加volatile关键字后,它将在操作后强制工作内存和主内存同步,以确保其他线程可以立即看到它。
多线程的同步和互斥有什么区别?
例如:如果将整个道路视为一个过程,则由道路中间的白色虚线分隔的车道就是过程中的线程。
①这些线程(通道)共享进程(道路)的公共资源(土地资源)。
②这些线程(车道)必须依赖于进程(道路),也就是说,没有进程线程就不可能存在(就像离开道路一样,车道是没有意义的)。
③这些线程(车道)可以同时执行(你走你的路,我走我的路),也可以同步执行(有些车道在红绿灯亮时不允许前进或转弯,必须等待其他车道的车辆通过)。
④这些线程(车道)依赖于代码逻辑(红绿灯)来控制操作。一旦代码逻辑控制出错(死锁,多个线程同时争夺唯一的资源),那么线程就会陷入混乱。
5. 在这些线程(通道)中谁先运行是未知的,只有当线程刚刚就绪并分配给CPU时间片(红绿灯改变)时才知道。注意:由于用于互斥的信号量SEM与所有并发进程相关,因此称为公共信号量。公共信号量的价值反映了公共资源的数量。只要临界区位于P(SEM)和V(SEM)之间,就可以实现过程间的互斥。就像火车上的每节车厢只有一个厕所一样,车厢里的所有乘客都共享这一公共资源:厕所,因此乘客进入厕所必须相互排斥。只要把马桶放在P(SEM)和V(SEM)之间,就可以达到互斥的效果。
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。