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

时间:2010-12-20 21:15:10

标签: java multithreading

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

非常感谢任何帮助

3 个答案:

答案 0 :(得分:9)

有几种选择:

1)完全不使用同步

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

2)将字段声明为易失性

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

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

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

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

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

答案 1 :(得分: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

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

答案 2 :(得分:1)