了解同步方法

时间:2015-07-06 08:44:58

标签: java multithreading

我是并发新手,想问下面这个问题。我有以下课程:

public class MyClass{

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

    public synchronized void method2(){
         //do another some
    }
}

因此,只要了解一些线程何时开始执行其中一个方法,就会获得this上的锁定。我的问题是,它是否意味着除非线程释放this,否则任何其他线程都不能执行同一对象的任何方法,如果要允许并发调用,我该怎么办?

2 个答案:

答案 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 
}
}