如果多个线程正在更新同一个变量,应该做什么,以便每个线程正确更新变量?

Ste*_*nte 9 java multithreading

如果多个线程正在更新同一个变量,我该怎么做才能让每个线程正确更新变量?

任何帮助将不胜感激

Eya*_*der 9

有几种选择:

1)根本不使用同步

这只能在数据是基本类型(不是长/双)的情况下工作,并且您不关心读取陈旧值(这不太可能)

2)将该字段声明为volatile

这将保证永远不会读取陈旧的值.它也适用于对象(假设对象在创建后没有更改),因为事先发生了对volatile变量的保证(参见"Java Memory Model").

3)使用java.util.concurrent.AtomicLong,AtomicInteger等

它们都是线程安全的,并支持特殊操作,如原子增量和原子比较和设置操作.

4)使用相同的锁保护读写

此方法提供了互斥,允许定义大型原子操作,其中多个数据成员作为单个操作进行操作.


Ser*_*lat 5

这是多线程应用程序的一个主要问题,并且在答案中涵盖的内容超出了我的实际范围,所以我会指出一些资源.

http://download.oracle.com/javase/tutorial/essential/concurrency/sync.html

http://www.vogella.de/articles/JavaConcurrency/article.html#concurrencyjava_synchronized

实质上,您使用synchronized关键字来锁定变量.这可以确保一段代码一次只运行一次.您还可以在多个区域中的同一对象周围放置锁.

此外,您需要注意几个陷阱,例如死锁.

http://tutorials.jenkov.com/java-concurrency/deadlock.html

错误使用锁导致的错误通常很难调试和追踪,因为它们不是很一致.因此,您始终需要小心将所有锁放在正确的位置.