问题描述
- JAVA多线程如何理解这句话?
-
如何理解“典型地,若将线程类的方法 run() 声明为synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何 synchronized 方法的调用都永远不会成功”
我觉得这句话有问题,这句话中的它应该指的就是run 方法,如果对run方法加锁,是可以调用这个(Thread)类中的其他synchronized修饰的其他方法的,所以我认为这里的第二个“它”应该指的是该Thread类的对象,不知理解得是否准确, 大家怎么看?
解决方案
求出处,run()并不是在在整个生命周期都运行的吧?
解决方案二:
实际测试,是可以调用其他加锁函数的。只能说是如果有两个该线程实例则无法同时运行。因此我认为这句话是错的。
解决方案三:
public class Console {
private static class MyThread extends Thread {
@Override
public synchronized void run() {
System.out.println("Running ...");
try {
Thread.sleep(1000l);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void test() {
System.out.println("aaa");
}
}
public static void main(String[] args) {
MyThread t = new MyThread();
t.start();
try {
Thread.sleep(500l);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 1000ms后执行
t.test();
}
结果:
Running ...
aaa
写了段代码,当t.start()之后,当知道到run()后,对t.test()的调用因为synchronized的原因等待。当run()方法执行结束后,t.test()执行。
MyThread t 只是一个对象,不用对他做特殊理解。当线程被执行后,相当于其他对象调用了t.run()方法,其他地方再调用被synchronized修饰的方法,当然不能执行。如果t.test()在t.start()方法之前调用,线程的执行还要等待t.test()执行完。
所以这句话“若将线程类的方法 run() 声明为synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何 synchronized 方法的调用都永远不会成功” 只有在run()方法死循环不退出的情况下才成立吧。
解决方案四:
我觉得这句话是不对的,在同一个类中使用synchronized修饰的非静态方法,是可以相互调用的,这是基于可重入锁的设计原理的。
其中的根源是synchronized这个同步策略使用的是锁是可重入的,即允许当前线程在已经拥有某个对象锁的前提下,再次请求获取该对象锁。Java的synchronized是支持锁的重入的。
所以这种说法不对。但是,可以肯定的是,这个线程运行期间,其他线程不能调用这个线程对象的其他synchronized方法,因为锁被占据着呢!
时间: 2024-08-07 05:31:31