在同一个班级

时间:2015-08-28 14:56:14

标签: java multithreading synchronization synchronized

类中有两种方法,都是同步的。 有两个线程同时运行。 thread1是否可以同时执行method1和thread2执行method2?

class A {

    public synchronized void method1() {


    }

    public synchronized void method2() {


    }

}

4 个答案:

答案 0 :(得分:3)

请记住,锁在实例级别工作,而不是在类级别工作。对于A的每个实例,method1method2之间的任何一个实例都可以在任何给定时刻运行。

但是,如果A有两个不同的实例,例如a1a2,则a1.method1()可以与a2.method1()(或{{1}交错运行}})。

答案 1 :(得分:1)

您的代码无法使用。

当您对整个方法使用关键字synchronized时,会对对象this 执行锁定。因此两种方法的锁相同(如果在同一对象上执行)。

但是如果你需要允许两个不同的线程同时访问method1和method2,你可以改变锁定:

Object lock1 = new Object();
Object lock2 = new Object();

public void method1() {
    synchronized(lock1) {
        ...
    }
}

public void method2() {
    synchronized(lock2) {
        ...
    }
}

这样做可以将同步锁定从this更改为lock1的对象method1以及lock2

method2

答案 2 :(得分:0)

不,同步会锁定一个对象,而不仅仅是该方法。一旦一个线程访问一个synchronized方法,该类中的其余方法(同步或不同步)将不再被任何其他线程访问,直到正在运行的线程进入可运行状态,其中锁定可用于下一个线索获得。

答案 3 :(得分:0)

所以我相信你问的问题是,“如果同步这两种方法,两个不同的线程能够访问两种不同的同步方法吗?”

答案是,这取决于。

与您提供的语法同步发生在实例级别。

因此,如果线程1和线程2访问同一个实例,则。 线程2被锁定,直到线程1可以处理。

但是,如果线程1和线程2访问不同的实例,则。 线程2不必等到线程1完成,因为实例不同。

更多同步参考: