如果我在实例方法中放置静态锁会发生什么?

时间:2014-07-12 15:09:33

标签: java multithreading

我是线程新手,目前正在进行线程同步章节。我对线程锁定中的一个场景有疑问

以下是我所知道的:

1:当我在实例方法(即)中放置实例锁时

private Object lock1= new Object();
private Object lock2 = new Object();
void f1(){
    synchronized (lock1) {

    }
}
void f2(){
    synchronized (lock2 ) {

    }
}

void f4(){
    synchronized (lock2 ) {

    }
}
void f3(){
    synchronized (lock1) {

    }
}

这里会发生的是,如果有多个线程共享一个类X的对象A,并且某个线程t1正在执行f1的块,那么直到t1出现f1块,所有其他线程都试图进入函数f3 ,, f1将被阻止。与f2和f4的情况相同。

现在在静态锁的情况下,如果一个类有多个静态方法,并且我们想要对这些方法进行单独锁定而不是类锁定,那么我们将有多个静态锁。这些锁定将决定阻止哪些方法。

到目前为止,一切都很好。现在如果将这个静态锁放在实例方法中,当同一个对象上的两个线程试图访问该方法时会发生什么?

2 个答案:

答案 0 :(得分:4)

当你synchronize static锁定实例方法时,只有一个线程能够进入该锁控制的关键部分,无论该对象的实例正在使用。

如果您将lock1设为静态,则系统范围内只有一个线程可以运行f1f3,即使您创建了数百个类X的实例,因为所有static成员,包括您锁定的对象,都在该类的所有实例之间共享。

答案 1 :(得分:0)

在并发情况下,始终将任何字段(lock1,lock2)设置为volatile或final。而且,如果您同步锁定一个代码块,静态上下文与否,则一次只能有一个线程通过。因此,这两个线程中的一个将被阻塞,直到另一个完成。