Ton*_*ony 32 java multithreading synchronized
我有4种方法(m1,m2,m3和m4一类).方法m1,m2并m3有synchronized方法.另外,我有4个线程t1,t2,t3和t4分别.
如果t1访问m1方法(synchronized方法),可以同时进行t2线程访问m2方法(synchronized方法)吗?如果不是t2的状态是什么?
aio*_*obe 45
如果t1访问m1方法(synchronized方法),可以同时进行t2线程访问m2方法(同步方法)吗?
该synchronized关键字适用于目标水平,且只有一个线程可持有对象的锁.因此,只要您谈论同一个对象,那么不会,t2等待t1释放进入时获取的锁定m1.
但是,线程可以通过调用释放锁而无需从方法返回Object.wait().
如果没有,那么t2的状态是什么?
它会坐下来等待t1释放锁(从方法返回或调用Object.wait()).具体来说,它将处于一种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());
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
BLOCKED
Run Code Online (Sandbox Code Playgroud)
And*_*yle 11
如果方法在同一监视器上同步,则它们不能在不同的线程中同时执行.当第二个线程进入监视器条目(在这种情况下是同步方法的开始)时,它将阻塞,直到第一个线程释放监视器.
在这种情况下,由jconsole报告的阻塞线程的实际状态将类似于 java.lang.Thread.State: WAITING (on object monitor)
假设所有方法都是普通的实例方法,那么当它们在同一个对象上调用时,它们将共享同一个监视器.也就是说,如果你有类似的东西:
// Thread 1
A a1 = new A();
a1.m1();
// Thread 2
A a2 = new A();
a2.m2()
Run Code Online (Sandbox Code Playgroud)
那么在这种情况下,第二个线程将能够调用该方法,因为它试图获取a2对象的隐式监视器,它不被线程1锁定.但是如果线程2试图调用a1.m2(),那么它将阻塞直到线程1完成了执行m1().
如果你有静态方法,那么它们会获得类本身的显式监视器(A.class在我的假设命名情况下),因此不会被任何实例方法调用阻止.
| 归档时间: |
|
| 查看次数: |
21927 次 |
| 最近记录: |