Java 线程死锁和同步

Java 线程死锁和同步,java,android,multithreading,thread-safety,Java,Android,Multithreading,Thread Safety,我知道我需要适当地使用同步,以避免在使用多个线程时出现死锁,但我想知道: 修改变量值和检查变量都需要同步,还是只在修改值时需要同步,而在检查变量时不需要同步?阅读这篇文章,这篇文章是我为您提供的关于同步的更好的知识库 阅读这篇文章,我的文章将为您提供有关同步的更好的知识库 至于死锁:Darkhogg已经正确地指出,死锁是由于不正确的同步和工作流造成的 同步状态修改和状态观察:是的,您需要同步两者。输入同步方法时获得的对象锁的效果是,没有其他线程输入需要相同对象锁(在同一对象上同步)的相同或其他同

我知道我需要适当地使用同步,以避免在使用多个线程时出现死锁,但我想知道:


修改变量值和检查变量都需要同步,还是只在修改值时需要同步,而在检查变量时不需要同步?

阅读这篇文章,这篇文章是我为您提供的关于同步的更好的知识库

阅读这篇文章,我的文章将为您提供有关同步的更好的知识库
至于死锁:Darkhogg已经正确地指出,死锁是由于不正确的同步和工作流造成的


同步状态修改和状态观察:是的,您需要同步两者。输入同步方法时获得的对象锁的效果是,没有其他线程输入需要相同对象锁(在同一对象上同步)的相同或其他同步代码块。也就是说,如果不同步观察对象状态的代码,然后,此代码可能与修改状态的同步代码同时执行,您可能会读取无效的对象状态。

至于死锁:Darkhogg已经正确指出,死锁是由于不正确的同步和工作流造成的


同步状态修改和状态观察:是的,您需要同步两者。输入同步方法时获得的对象锁的效果是,没有其他线程输入需要相同对象锁(在同一对象上同步)的相同或其他同步代码块。也就是说,如果不同步观察对象状态的代码,则此代码可能会与修改状态的同步代码同时执行,并且您可能会读取无效的对象状态。

如果您有一个非线程安全的资源,则需要保护检查和修改其值

如果您有一个非线程安全的资源,您需要检查和修改它的值

正如Darkhogg提到的,如果使用不当,同步会导致死锁

您需要同步正在更新(更改数据成员)值且可由多个线程执行的数据成员上的代码块


使其同步将确保数据成员不会同时更新

正如Darkhogg提到的,如果使用不当,同步会导致死锁

您需要同步正在更新(更改数据成员)值且可由多个线程执行的数据成员上的代码块


使其同步将确保数据成员不会同时更新

Synchronized不用于避免死锁

Synchronize关键字确保多线程环境中的线程安全。虽然您有一个多线程,但您希望修改和检查成员变量

class exam
{
 ....

 synchronized void examine()
 {}


 synchronized void amending()
 {}


}
为此,创建一个包含要线程安全的数据变量的类。创建用于附加和检查变量的同步函数

class exam
{
 ....

 synchronized void examine()
 {}


 synchronized void amending()
 {}


}

创建该类的单个对象并将其传递给您的所有线程。

同步不用于避免死锁

Synchronize关键字确保多线程环境中的线程安全。虽然您有一个多线程,但您希望修改和检查成员变量

class exam
{
 ....

 synchronized void examine()
 {}


 synchronized void amending()
 {}


}
为此,创建一个包含要线程安全的数据变量的类。创建用于附加和检查变量的同步函数

class exam
{
 ....

 synchronized void examine()
 {}


 synchronized void amending()
 {}


}

创建该类的单个对象并将其传递给您的所有线程。

同步并不能避免死锁,它会在未正确使用时导致死锁。@Darkhogg这就是我的意思。希望我的更新能反映这一点。同步并不能避免死锁,它会在未正确使用时导致死锁。@Darkhogg这就是我的意思。希望我的更新反映了这一点。谢谢你的信息。如果只有一个线程(线程A)更新,而其他线程(线程B+)只访问数据值,该怎么办。线程B+必须同步访问吗?仅仅访问或读取数据不是代码的关键部分,因此您不需要同步代码的这一部分,但这与Raif的答案不矛盾吗?@ralf是对的,您也应该有一个ReadLock。读取不会影响对象的一致性,但可能会导致脏就绪。当成员的某个值被更改并且您读取该值时,它可能是最终被更改的中间值。拥有读锁会使您的操作变慢,但这样做是安全的。谢谢您提供的信息。如果只有一个线程(线程A)更新,而其他线程(线程B+)只访问数据值,该怎么办。线程B+必须同步访问吗?仅仅访问或读取数据不是代码的关键部分,因此您不需要同步代码的这一部分,但这与Raif的答案不矛盾吗?@ralf是对的,您也应该有一个ReadLock。读取不会影响对象的一致性,但可能会导致脏就绪。当成员的某个值被更改并且您读取该值时,它可能是最终被更改的中间值。拥有读锁会使您的操作变慢,但这样做是安全的。