java线程同步的问题,究竟线程在什么时候释放锁
代码如下:同步资源对象publicclassMyResource{publicsynchronizedvoidf(){..};publicsynchronizedvoid...
代码如下:
同步资源对象
public class MyResource{
public synchronized void f() {..};
public synchronized void g() {..};
public synchronized void h() {..};
}
线程同步访问方法
public static void main(String[] args) {
final MyResource rs = new MyResource();
new Thread() {
public void run() {
rs.f();
rs.h();
}
}.start();
new Thread() {
public void run() {
rs.g();
}
}.start();
}
此时实验结果的输出为(为什么输出结果顺序是f()-g()-h()而不是f()-h()-g()??线程1是否在调用rs.f()后就释放了对象锁?而不是顺序执行完run()方法继续执行rs.h()的所有代码?没太弄懂,求大神解释):
Thread-0:synchronized in f()
Thread-0:synchronized in f()
Thread-0:synchronized in f()
Thread-0:synchronized in f()
Thread-0:synchronized in f()
Thread-1:synchronized in g()
Thread-1:synchronized in g()
Thread-1:synchronized in g()
Thread-1:synchronized in g()
Thread-1:synchronized in g()
Thread-1:synchronized in h()
Thread-1:synchronized in h()
Thread-1:synchronized in h()
Thread-1:synchronized in h()
Thread-1:synchronized in h()
the lock(monitor) would be released automatically by the thread as soon as it (the thread) finishes executing the method (or block of code). 这里的method指的是run方法还是同步对象中的方法???? 搞定,根据括号中的(或是是同步块中的代码),这里肯定值的是对象中的同步方法,线程在执行完一个同步方法f()后则释放了同步锁,然后该锁被线程1拿到,执行完g(),然后再被线程0拿到,输出
Thread-0:synchronized in f()
Thread-1:synchronized in g()
Thread-0:synchronized in h() 展开
同步资源对象
public class MyResource{
public synchronized void f() {..};
public synchronized void g() {..};
public synchronized void h() {..};
}
线程同步访问方法
public static void main(String[] args) {
final MyResource rs = new MyResource();
new Thread() {
public void run() {
rs.f();
rs.h();
}
}.start();
new Thread() {
public void run() {
rs.g();
}
}.start();
}
此时实验结果的输出为(为什么输出结果顺序是f()-g()-h()而不是f()-h()-g()??线程1是否在调用rs.f()后就释放了对象锁?而不是顺序执行完run()方法继续执行rs.h()的所有代码?没太弄懂,求大神解释):
Thread-0:synchronized in f()
Thread-0:synchronized in f()
Thread-0:synchronized in f()
Thread-0:synchronized in f()
Thread-0:synchronized in f()
Thread-1:synchronized in g()
Thread-1:synchronized in g()
Thread-1:synchronized in g()
Thread-1:synchronized in g()
Thread-1:synchronized in g()
Thread-1:synchronized in h()
Thread-1:synchronized in h()
Thread-1:synchronized in h()
Thread-1:synchronized in h()
Thread-1:synchronized in h()
the lock(monitor) would be released automatically by the thread as soon as it (the thread) finishes executing the method (or block of code). 这里的method指的是run方法还是同步对象中的方法???? 搞定,根据括号中的(或是是同步块中的代码),这里肯定值的是对象中的同步方法,线程在执行完一个同步方法f()后则释放了同步锁,然后该锁被线程1拿到,执行完g(),然后再被线程0拿到,输出
Thread-0:synchronized in f()
Thread-1:synchronized in g()
Thread-0:synchronized in h() 展开
3个回答
展开全部
这样说吧,这个跟你的cpu也有关系的,一个线程并不是一直占用cpu的,假如一个线程需要执行5毫秒,排除其他线程的影响,那么现在有线程A和线程B两个线程,执行顺序可能是,A执行了2毫秒,B再执行2毫秒,A再两毫秒,接着B再执行,轮流执行,直到两个线程结束。这样出现上面的问题就不奇怪了,至于你说的同步锁,只是加在了方法上,如果给f()和h()一起加一个锁,就没问题了。还有,单核的和多核的cpu的输出结果也可能天差地别,如果处理g()的cpu空闲一点,有可能g()会先输出。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你没有优先级的话,这几个线程是随即的 不一定按照你写的顺序进行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询