Discuss / Java / 廖老师,最后这个例子中,需要给int[] pair加volatile吧?

廖老师,最后这个例子中,需要给int[] pair加volatile吧?

Topic source

廖老师,在“中断线程”这篇文章中,您提到为保证可见性,要给共享变量加volatile,volatile是共步写,写完线程的工作内存,会立即写入主内存。

那当前这篇文章中,是不是应该给int[] pair也加volatile呢?假设有另外一个线程会读取volatile。我理解如果不加volatile,下面的赋值语句写入的只是线程的工作内存吧?什么时间同步到主内存并不确定

int[] ps = new int[] { first, last };

廖雪峰

#2 Created at ... [Delete] [Delete and Lock User]

x86架构加不加volatile其实区别不大,其他架构要注意,很可能一个线程改了值几秒内另一个线程读的还是旧的

Get it,谢谢廖老师

云外方天

#4 Created at ... [Delete] [Delete and Lock User]

这个是局部变量,不需要加volatile吧。

int[] ps = new int[] { first, last };

比如thread_1运行到这里,赋值后是

int[] ps = new int[] { 10, 20 };

然后线程阻塞,thread_2进来,赋值后是

int[] ps = new int[] { -5, 8 };

此时无论是thread_2继续运行进行共享变量pair赋值,还是它被阻塞,thread_1开始运行进行共享变量pair赋值

this.pair = ps;

因为他们各自持有的ps数组都是自己的,所以最后获取到的pair数组也是自己的。

他的意思是 pair要加


  • 1

Reply