gpt4 book ai didi

java - 同步线程和锁定

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:40:54 25 4
gpt4 key购买 nike

谁能解释一下这两个例子在对象锁定上下文中的区别:

public void method1(){
synchronized(this){
....
}
}

StringBuffer aStringBufferObject = new StringBuffer("A");

public void method2(){
synchronized(aStringBufferObject){
....
}
}

我知道第一个示例将获得 this 实例的锁,第二个将获得 aStringBufferObject 实例的锁。但我真的不明白两者的作用或区别是什么。

例如,在第二个例子中,线程是否仍然能够执行同步块(synchronized block)内的代码,因为锁与“this”实例无关?

我知道同步一个方法或一个代码块可以防止多个线程同时访问该 block /方法,但是指定要锁定的对象的目的是什么以及对象的方式有什么区别是否指定为上述示例?

最佳答案

What is the purpose of specifying the object to lock on?

通常,在 thisClass 实例(对于静态方法)上同步更容易。但是,在某些情况下,您需要在特定对象而不是隐式锁 (this) 上进行同步。此类情况包括:

  • 您想在不使用this 的情况下同步对原语的访问。您只能在 Object 上同步,因为每个 Object 都与 Java 中的隐式监视器相关联。原语没有这样的隐式监视器,因此您需要使用锁对象。使用包装器类是一个糟糕且不正确的选择,尤其是当您最终得到 modifying the lock object in the guarded block 时。 .
  • 您想在一个实际保护临界区的对象上进行同步,而在 this 上进行同步不会提供线程安全保证。例如,如果您要同步访问在类 A 的实例之间共享的 ArrayList 实例,那么在 A 的实例上同步是无用的。一个线程可能会创建 A 的新实例并获得对该列表的访问权限,而另一个线程正在修改它。如果您使用所有线程都必须争用的不同锁,那么您可以保护列表;此锁可以是与 A.class 关联的锁,但它可以是任何提供相同保证的对象。
  • 您想执行锁拆分以确保不同的 protected block 由不同的锁而不是相同的锁保护。换句话说,如果允许不同的线程获取不同的锁来访问不同的临界区是线程安全的,那么您可以为每个临界区拥有不同的锁。

下面是拆分锁的使用示例:

private Object method1Lock = new Object();
private Object method2Lock = new Object();

public void method1(){
synchronized(method1Lock){
....
}
}

public void method2(){
synchronized(method2Lock){
....
}
}

当您可以确保 method1method2 的并发执行不违反类不变量时,您可以使用拆分锁。这样,您可以提高需要访问同一对象但调用不同方法的线程的性能。


关于你的另一个问题,

For example, in the second example, will threads still be able to execute the code inside the synchronized block because the lock is not related to the 'this' instance?

在第二个示例中,任何进入 protected 区域的线程都必须获取与aStringBufferObject 关联的锁。如果另一个线程持有该锁,则当前线程将不会继续执行。当您指定 this 时,线程必须获取与当前对象关联的锁。在这两种情况下,线程都必须获得锁。这些示例仅在用作锁的对象上有所不同。

关于java - 同步线程和锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6807346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com