多线程中的race condition问题
在多线程中, java语言有一个synchronized关键字, 作用是防止两个或多个线程在同一时间点对相同的对象调用它的method(它:代表该对象中被synchronized关键字修饰的方法)
下面有这么个runnable对象;
public class A extends Runnable {
public synchronized void b() {
...
}
public synchronized void c() {
...
}
public void d() {
...
}
public void run() {
...
}
...
}
现在A对象objectA中有三个线程调用它, 一个是通过Thread(a)构造的本身的线程threadA,还有两个其他的线程threadB,threadC.如果现在threadB调用了方法b(), 那么现在对象objectA被locked住了。按照race condition, 现在其他所有的线程,比如threadC想访问方法c(),那么将会处于等待状态。
问题:
1,如果threadA访问d(),在threadB调用了方法b()还没有返回前, 是否可以执行?
2,如果threadA访问c(),在threadB调用了方法b()还没有返回前, 是否可以执行?
我的理解: 通过synchronized修饰过的方法, 条件:threadB调用了方法b(),对象objectA被锁住了,锁住的是被synchronized修饰过的方法。
1,其他线程包括自身可以访问该对象非synchronized修饰过的方法,如A中的方法d()。
2,其他线程包括自身不可以在此刻访问该对象synchronized修饰过的所有方法,如A中的方法b(),c()。
总结: 就是对象中的线程锁只是锁住了synchronized修饰的方法, 而没有锁住非synchronized修饰的方法。
各位大虾,不知道我这样理解对么? 我们大家一起讨论一下, 看看那位大虾有更好的理解