gpt4 book ai didi

java - 同步块(synchronized block)会锁定整个对象还是单独锁定方法?

转载 作者:行者123 更新时间:2023-12-04 18:01:56 26 4
gpt4 key购买 nike

我在一个类中有多个方法,并且大多数方法都有关键部分(共享数据)。所以我将这些方法设为同步。假设线程 t1 正在运行同步块(synchronized block)之一。同时线程 t2 可以访问其他方法的临界区吗?

class Sample{

synchronized public void method1(){

}

synchronized public void method2(){

}

synchronized public void method3(){

}

public void method4(){

}

}

最佳答案

同步总是锁定一个对象。在同步方法的情况下,对象是 this .所以基本上这两种方法都是一样的:

synchronized public void method1() {
// do something
}


public void method1() {
synchronized(this){
// do something
}
}

只要一个线程拥有锁对象上的锁,其他线程就不能锁定这个对象。因此,在您的示例中,同步方法(一、二和三)永远不能同时执行。 method4不同步,所以它可以随时访问对象。

如果你想要更细粒度的锁定,因为 method1method2应该是排他的和 method3method4你可以使用例如这样的东西:
class Sample{
private final Object lock1 = new Object();
private final Object lock2 = new Object();

public void method1(){
synchronized(lock1) {
// do something
}
}
public void method2(){
synchronized(lock1) {
// do something
}
}

public void method3(){
synchronized(lock2) {
// do something
}
}
public void method4(){
synchronized(lock2) {
// do something
}
}
}

然后您甚至可以使用 synchonized(lock)方法只包装需要同步的语句,而不是整个方法:
public void method() {
// some code
synchronized(lock) {
// code that must be synchronized
}
// some other code
}

使用这种方法,您可以将锁定持续时间保持在最短。

关于java - 同步块(synchronized block)会锁定整个对象还是单独锁定方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44963842/

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