synchronized如何保证可见性?
时间: 2023-12-13 20:24:38 浏览: 96
synchronized关键字可以保证多个线程对共享变量的修改在不同线程之间是可见的。具体来说,synchronized通过在执行unlock之前将共享变量的值同步回主内存来实现可见性。当一个线程对共享变量进行修改时,它会首先将共享变量的值从主内存加载到工作内存中,然后对该值进行修改。当线程释放锁(即执行unlock操作)时,会将修改后的值同步回主内存中,以保证其他线程能够看到最新的值。
在synchronized中,当一个线程对共享变量进行unlock操作时,会发生内存屏障(Memory Barrier)的操作,这个过程确保了共享变量的修改对其他线程的可见性。
需要注意的是,synchronized关键字不仅保证了可见性,还保证了原子性和有序性。通过让只有一个线程可以同时对同一个变量进行lock操作,synchronized保证了多个线程对共享变量的访问是有序的,从而避免了指令重排序带来的问题。
相关问题
synchronized 保证可见性
是的,synchronized关键字除了可以保证线程之间的互斥访问,还可以保证可见性。当一个线程进入synchronized代码块时,会获取锁并清空工作内存,然后从主内存中拷贝共享变量的最新值到工作内存中。当线程释放锁时,会将工作内存中的值刷新回主内存,这样其他线程就能看到最新的值。
通过加锁和释放锁的操作,synchronized确保了共享变量的可见性,一个线程修改了共享变量的值,其他线程在获取锁之后能够看到更新后的值。因此,synchronized关键字不仅保证了互斥访问,也保证了可见性。
synchronized保证可见性
synchronized确实可以保证可见性,这是因为synchronized会在进入和退出同步块时自动执行锁的获取和释放操作。在获取锁之前,线程的工作内存会被清空,强制从主内存中重新读取共享变量最新的值。在释放锁之后,线程的工作内存中对共享变量的修改会立即刷新到主内存中,使得其他线程能够看到最新的值。因此,通过synchronized的加锁和解锁操作,可以保证共享变量的可见性。
阅读全文