如果多个线程正在更新同一个变量,我该怎么做才能让每个线程正确更新变量?
非常感谢任何帮助
答案 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)