Shi*_*han 6 java multithreading volatile
考虑Java Concurrency in Practice中的片段-
@ThreadSafe
public class SynchronizedInteger{
@GuardedBy("this") private int value;
public synchronized int getValue() {
return value;
}
public synchronized void setValue(int value) {
this.value = value;
}
}
Run Code Online (Sandbox Code Playgroud)
来自同一本书的摘录 -
考虑volatile变量的好方法是想象它们的行为大致类似于上面列出的SynchronizedInteger类,用get和set调用替换volatile变量的读写.然而,访问volatile变量不会执行锁定,因此不会导致执行线程阻塞,从而使volatile变量的同步机制比同步更轻.
线程限制的特殊情况适用于volatile变量.只要确保volatile变量仅从单个线程写入,就可以安全地对共享的volatile变量执行读 - 修改 - 写操作.
因此,如果您将上述类中的实例变量设置为volatile,然后删除synchronized关键字,那么假设有3个线程
线程A和线程B正在写入相同的volatile变量.
线程C读取volatile变量.
由于volatile变量现在是从2个线程写入的,为什么对这个共享的volatile变量执行读 - 修改 - 写操作是不安全的?
小智 4
该关键字volatile用于确保对您的更改Object将被其他人看到Thread。这并不强制要求在操作完成之前Object执行非原子操作而不会受到其他干扰。Thread为了强制执行此操作,您将需要关键字synchronized。