我是线程新手,目前正在进行线程同步章节。我对线程锁定中的一个场景有疑问
以下是我所知道的:
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的情况相同。
现在在静态锁的情况下,如果一个类有多个静态方法,并且我们想要对这些方法进行单独锁定而不是类锁定,那么我们将有多个静态锁。这些锁定将决定阻止哪些方法。
到目前为止,一切都很好。现在如果将这个静态锁放在实例方法中,当同一个对象上的两个线程试图访问该方法时会发生什么?
答案 0 :(得分:4)
当你synchronize
static
锁定实例方法时,只有一个线程能够进入该锁控制的关键部分,无论该对象的实例正在使用。
如果您将lock1
设为静态,则系统范围内只有一个线程可以运行f1
或f3
,即使您创建了数百个类X
的实例,因为所有static
成员,包括您锁定的对象,都在该类的所有实例之间共享。
答案 1 :(得分:0)
在并发情况下,始终将任何字段(lock1,lock2)设置为volatile或final。而且,如果您同步锁定一个代码块,静态上下文与否,则一次只能有一个线程通过。因此,这两个线程中的一个将被阻塞,直到另一个完成。