当一个线程进入对象的synchronized方法后,其它线程是否可进入此对象的其它方法?
分两种情况:
1、进入此对象的非同步方法
答案:可以
2、进入此对象的同步方法
答案:不可以,因为对象的锁被占用中,必须要获取同步锁才能进入同步方法。
eg:
public class MultiSynchronizedTest {
public synchronized void test1() {
System.out.println("test1 method entry");
try {
Thread.sleep(5000); // 当前线程休眠5秒,sleep不释放锁
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("test1 method out");
}
public synchronized void test2() {
System.out.println("test2 method entry");
try {
Thread.sleep(5000); // 当前线程休眠5秒,sleep不释放锁
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("test2 method out");
}
}
public class ThreadA implements Runnable {
private MultiSynchronizedTest multiSync;
public ThreadA(MultiSynchronizedTest multiSync) {
this.multiSync = multiSync;
}
@Override
public void run() {
System.out.println("ThreadName: " + Thread.currentThread().getName());
multiSync.test1();
}
}
public class ThreadB implements Runnable {
private MultiSynchronizedTest multiSync;
public ThreadB(MultiSynchronizedTest multiSync) {
this.multiSync = multiSync;
}
@Override
public void run() {
System.out.println("ThreadName: " + Thread.currentThread().getName());
multiSync.test2();
}
}
public class MainTest {
public static void main(String[] args) {
MultiSynchronizedTest multiSync = new MultiSynchronizedTest();
new Thread(new ThreadA(multiSync)).start();
new Thread(new ThreadB(multiSync)).start();
}
}
执行结果如下:
ThreadName: Thread-1
test2 method entry
ThreadName: Thread-0
test2 method out(等待5秒后执行完test2同步方法,然后test1同步方法获取锁执行)
test1 method entry
test1 method out(等待5秒输出test1方法输出结果)