Java中的易失性和同步关键字
可能重复:Java中的易失性和同步关键字,java,Java,可能重复: 我对两个java关键字synchronized和volatile有点困惑 据我所知,由于java是一种多线程语言,并且通过使用关键字synchronized将强制它在一个线程中执行。我说得对吗 volatile也做同样的事情?本质上,volatile用于表示变量的值将由不同的线程修改 Synchronized是一个关键字,其总体目的是一次只允许一个线程进入代码的特定部分,从而允许我们保护变量或数据,例如,不受来自不同线程的同时修改的破坏 对于long和double而言,读写操作不是
我对两个java关键字
synchronized
和volatile
有点困惑
据我所知,由于java是一种多线程
语言,并且通过使用关键字synchronized
将强制它在一个线程中执行。我说得对吗
volatile也做同样的事情?本质上,volatile用于表示变量的值将由不同的线程修改
Synchronized是一个关键字,其总体目的是一次只允许一个线程进入代码的特定部分,从而允许我们保护变量或数据,例如,不受来自不同线程的同时修改的破坏 对于
long
和double
而言,读写操作不是原子操作。
volatile
是一个修饰符,您可以在变量上添加它,使读写操作原子化(包括long
和double
)
这篇文章得到了更多的信息
基本上,它是为了确保如果一个线程更改了变量的值,那么其他线程将看到该更改,并且在其写入时将无法读取该更改。它与中所述的一样复杂。同步意味着在给定时间只有一个线程可以访问该方法或代码块
Volatile处理线程之间的通信。这里有一个很好的解释:volatile和synchronized都保证了可见性,但synchronized也提供了原子性:
- 如果一个线程读取一个易失性变量,它可以保证看到之前对该变量的写入,包括它们是否由其他线程完成
- 同步块提供了相同的保证(前提是写入和读取是在同一个监视器中完成的),但也提供了原子性保证:同步块中的所有指令将从同一锁上同步的另一个线程中看起来是原子的
我所知道的用Java编写可靠并发代码的最佳方法是阅读“Java是一种多线程语言”。如果你是说Java是线程安全的,那就错了。根据它的说法,它是一种多线程语言。这个页面看起来一点也不可信。Java支持线程,我想如果您在代码中启动多个线程,您就是在创建多线程应用程序。然而Java语言并没有非常新颖的结构来运行线程。一个简单的google搜索提供了很好的答案。它说
volatile
用于减少内存一致性错误?那是什么意思mean@user1315906线程可以缓存变量的值。因此,即使一个线程将更新某些值,也存在其他线程将使用其缓存值的风险。为了防止缓存变量,请使用volatile
。volatile的主要承诺不是原子性,而是可见性。内存位置中的ad原子操作是什么意思?对不起,这是打字错误,我的意思是读取或写入变量将是原子操作。volatile的主要承诺不是原子性,而是可见性。我在线程中多次遇到不使用volatile的问题,因为没有共享布尔变量的线程正在访问缓存副本。谢谢。从您提供的链接中理解了volatile
。