我是并发新手,想问下面这个问题。我有以下课程:
public class MyClass{
public synchronized void method1(){
//do some
}
public synchronized void method2(){
//do another some
}
}
因此,只要了解一些线程何时开始执行其中一个方法,就会获得this
上的锁定。我的问题是,它是否意味着除非线程释放this
,否则任何其他线程都不能执行同一对象的任何方法,如果要允许并发调用,我该怎么办?
答案 0 :(得分:5)
这意味着没有其他线程可以执行同一对象的任何 synchronized 方法。如果某个方法未同步,则不会尝试获取锁定,因此可以同时调用不同的线程。 (当然,你必须确保自己的方法是线程安全的。)
如果您想要更好地控制同步策略,则需要创建和维护自己的锁。经典的方法如下:
class {
Object lock1;
Object lock2;
void method1() {
synchronized (lock1) {
...
}
}
void method2() {
synchronized (lock2) {
...
}
}
}
这使用了每个Java对象都带有内置锁的事实。现在这两种方法都使用自己的锁,因此当一个线程锁定method1
时,另一个线程仍然可以调用method2
。
为了更多地控制可以读取或写入对象的线程数,可以使用java.util.concurrent.locks
包中的锁。
答案 1 :(得分:2)
@ user3663882,正如@Hoopje"上面回复的那样,没有其他线程可以执行同一对象的任何同步方法。"
你进一步问道。 "但是,如果需要使这个限制变得更弱,那该怎么办?我想让两个不同的线程调用同一个对象的两个不同方法。它有意义吗?" 在这种情况下,您需要重新设计您的方法。您可以只将每个方法的特定代码标记为已同步,而不是将整个方法设置为同步。 因此锁定期将最小化。
public class MyClass{
public void method1(){
//do some before synchronization
synchronized(this){
// do some
}
//do some before synchronization
}
public void method2(){
//do some before synchronization
synchronized(this){
// do some
}
//do some before synchronization
}
}