我一直在经历JCIP,作者在那里说..
线程限制的特殊情况适用于volatile变量.只要确保volatile变量仅从单个线程写入,对共享的volatile变量执行读 - 修改 - 写操作是安全的.
例如,count ++被认为是一个复合操作(读取值,向其中添加一个值,并更新值)并将count指定为volatile不会使此操作成为原子操作,因此这里不保证线程安全!我对吗 ??但是这里作者说我们可以修复它,如果我们确保volatile变量只是从一个线程写的.我没理解这一点.请提供说明.
我正在编写一个多线程程序,正在研究是否应该使用volatile我的布尔标志.关于并发性的文档oracle跟踪并没有解释除以下内容memory consistency errors之外的任何内容:
当不同的线程具有应该是相同数据的不一致视图时,会发生内存一致性错误.
假设这些不一致的视图仅在"写入"操作之后发生是有意义的.但是多久之后呢?
例1
Thread A: Retrieve flag.
Thread B: Retrieve flag.
Thread A: Negate retrieved value; result is true.
Thread A: Store result in flag; flag is now true.
Thread B: System.out.print(flag) --> false
Run Code Online (Sandbox Code Playgroud)
由于Thread A并且Thread B同时运行,打印也可能导致true,具体取决于检索的时间flag.对于不一致而言,这是完全合理的.
但是memory consistency errors描述的方式(写入变量不一定反映在其他线程中)听起来这也是如此:
例2
Thread A: Retrieve flag.
Thread A: Change retrieved value; result is true.
Thread A: Store result in flag; flag is now true. …Run Code Online (Sandbox Code Playgroud) 我了解public和private关键字的基本知识(我仍然不确定是什么protected)
我有一个关于“保护数据成员以确保线程安全”的问题。
例如,假设我有一个类MyClass扩展Thread和属于这个类是私人称为数据成员MyDataMember。假设这个数据成员有公共访问器和设置器函数,确保同步数据成员。
现在,从“外部”的角度来看,这一切都很好,因为其他线程只能在正确同步时设置和检索数据成员。但是,怎么样等功能之内 MyClass?假设我在 MyClass调用中还有另一个函数DoSomething。我知道我不应该尝试MyDataMember直接访问,但我可能会不时忘记调用访问器/设置器方法并直接访问/设置数据成员。
我的问题是:是否有一个关键字可以用来声明函数成员对某些数据成员的独占访问?这样,如果我“不小心”从没有独占访问权的方法中直接访问数据成员,则会发生错误。我只是认为这会使开发过程中的事情变得更安全(至少对我而言!)