java synchronized方法中的Thread.sleep()问题
今天学习多线程,知道了不同方法使用synchronized只要拥有相同的对象监视器,只允许一个线程访问。于是我测试了一下:
多次运行结果为同一个:
method1
method1
method1
method1
method1
method2
method2
method2
method2
method2
method3
method3
method3
method3
method3
没问题,加锁的方法只有当前线程运行结束后才会运行下一个。
但我在方法f1();中休眠0.5秒,即:
运行结果:
method1
method1
method3
method3
method3
method3
method3
method2
method2
method2
method2
method2
method1
method1
method1
并且运行结果不一定相同。
使用了synchronized的方法为什么在使用了sleep之后当前线程退出了,既然退出为什么不在第一个mehtod1输出完后执行别的线程?还是我的理解有错,希望加以指正,谢谢!
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输出完后执行别的线程?还是我的理解有错,希望加以指正,谢谢!
...全文
相关推荐
Java Synchronized锁失败案例及解决方案
主要介绍了Java Synchronized锁失败案例及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Java使用synchronized实现互斥锁功能示例
主要介绍了Java使用synchronized实现互斥锁功能,结合实例形式分析了Java使用synchronized互斥锁功能简单实现方法与操作技巧,需要的朋友可以参考下
JAVA面试题 简谈你对synchronized关键字的理解
主要介绍了JAVA面试题 请谈谈你对Sychronized关键字的理解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
实例讲解Java中的synchronized
主要介绍了Java中synchronized的使用方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
JAVA synchronized详解
记下来,很重要。 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。


