java synchronized方法中的Thread.sleep()问题

qq_31376151 qq_31376151 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
今天学习多线程,知道了不同方法使用synchronized只要拥有相同的对象监视器,只允许一个线程访问。于是我测试了一下:

public class Test {
V v = new V();
public void go() {
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
v.f1();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
v.f2();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 5; i++) {
v.f3();
}
}
}).start();
}

public static void main(String[] args) {
Test t = new Test();
t.go();
}
class V {
public synchronized void f1() {
System.out.println("method1");
}
public synchronized void f2() {
System.out.println("method2");
}

public synchronized void f3() {
System.out.println("method3");
}
}
}

多次运行结果为同一个:
method1
method1
method1
method1
method1
method2
method2
method2
method2
method2
method3
method3
method3
method3
method3
没问题,加锁的方法只有当前线程运行结束后才会运行下一个。
但我在方法f1();中休眠0.5秒,即:

public synchronized void f1() {
System.out.println("method1");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

运行结果:
method1
method1
method3
method3
method3
method3
method3
method2
method2
method2
method2
method2
method1
method1
method1
并且运行结果不一定相同。
使用了synchronized的方法为什么在使用了sleep之后当前线程退出了,既然退出为什么不在第一个mehtod1输出完后执行别的线程?还是我的理解有错,希望加以指正,谢谢!
...全文

相关推荐

评论 6
收藏 已收藏
分享
返回顶部
qq_31376151
Java 51,407 成员 86,126 内容