我有4种方法(m1
, m2
, m3
and m4
)在课堂上。方法m1
, m2
and m3
are synchronized
方法。另外,我有4个线程t1
, t2
, t3
and t4
分别。
If t1
访问m1
方法(同步方法),可以t2
线程访问m2
方法(同步方法)同时进行?如果不是的话t2会是什么状态?
如果t1访问m1方法(同步方法),t2线程是否可以同时访问m2方法(同步方法)?
The synchronized
关键字适用于对象级别,并且只有一个线程可以持有该对象的锁。所以只要你谈论的是同一个对象,那么no, t2
会等待t1
释放进入时获取的锁m1
.
然而,线程可以通过调用释放锁而不从方法返回Object.wait()
.
如果不是,t2 的状态会是什么?
它会坐稳并等待t1
释放锁(从方法返回或调用Object.wait()
)。具体来说,它将在一个BLOCKED state http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.State.html#BLOCKED.
线程被阻塞等待监视器锁的线程状态。处于阻塞状态的线程正在等待监视器锁进入同步块/方法或调用后重新进入同步块/方法Object.wait
.
示例代码:
public class Test {
public synchronized void m1() {
try { Thread.sleep(2000); }
catch (InterruptedException ie) {}
}
public synchronized void m2() {
try { Thread.sleep(2000); }
catch (InterruptedException ie) {}
}
public static void main(String[] args) throws InterruptedException {
final Test t = new Test();
Thread t1 = new Thread() { public void run() { t.m1(); } };
Thread t2 = new Thread() { public void run() { t.m2(); } };
t1.start();
Thread.sleep(500);
t2.start();
Thread.sleep(500);
System.out.println(t2.getState());
}
}
Output:
BLOCKED
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)