2 xuxiaoyinliu xuxiaoyinliu 于 2016.02.23 20:16 提问

JAVA多线程如何理解这句话?

如何理解“典型地,若将线程类的方法 run() 声明为synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何 synchronized 方法的调用都永远不会成功”
我觉得这句话有问题,这句话中的它应该指的就是run 方法,如果对run方法加锁,是可以调用这个(Thread)类中的其他synchronized修饰的其他方法的,所以我认为这里的第二个“它”应该指的是该Thread类的对象,不知理解得是否准确, 大家怎么看?

4个回答

luochoudan
luochoudan   Ds   Rxr 2016.02.23 22:31

求出处,run()并不是在在整个生命周期都运行的吧?

xuxiaoyinliu
xuxiaoyinliu 这个百度一下有很多,比如这个http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html
接近 2 年之前 回复
hyb1996
hyb1996   2016.02.24 10:07

实际测试,是可以调用其他加锁函数的。只能说是如果有两个该线程实例则无法同时运行。因此我认为这句话是错的。

wtjrenranwtj
wtjrenranwtj   2016.02.24 10:27
 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()方法死循环不退出的情况下才成立吧。

xuxiaoyinliu
xuxiaoyinliu 这样理解好像还是有点问题,因为这句话中的“它”指的应该是run方法,字面意思上看这句话是想表达“synchronized修饰的run方法无法调用这个Thread类的其他synchronized方法”,但如果按这种说法测试一下的话发现是不对的
接近 2 年之前 回复
wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.02.24 18:12

我觉得这句话是不对的,在同一个类中使用synchronized修饰的非静态方法,是可以相互调用的,这是基于可重入锁的设计原理的。
其中的根源是synchronized这个同步策略使用的是锁是可重入的,即允许当前线程在已经拥有某个对象锁的前提下,再次请求获取该对象锁。Java的synchronized是支持锁的重入的。
所以这种说法不对。但是,可以肯定的是,这个线程运行期间,其他线程不能调用这个线程对象的其他synchronized方法,因为锁被占据着呢!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!