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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Java核心技术36讲——谈谈你对Java体系的理解?“Java是解释执行”,这句话是正确的吗?
典型回答 Java 本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的“书写一次,到处运行”(Write once, run anywhere),能够非常容易地获得跨平台能力;另外就是垃圾收集(GC, Garbage Collection),Java 通过垃圾收集器(Garbage Collector)回收分配内存,大部分情况下,程序员不需要自己操心内存的分配和回收。 我们日常会...
java面试题及部分答案整理
谈谈你对java体系的理解?“java是解释执行”,这句话是正确的吗? java底层有jvm(java虚拟机)来兼容不同的操作系统,java运行前会编译成jvm可以识别的字节码我们常说的class文件,然后由jvm来解释执行。 请对比Exception和Error,运行时异常与一般异常有什么区别? Error :表示由 JVM 所侦测到的无法预期的错误,由于这是属于 JVM 层次的严重错误 ...
如何理解 servlet 的单实例多线程
如何理解 servlet 的单实例多线程 http://blog.csdn.net/nieyinyin/article/details/7470576
Java泛型的协变
在上篇《Java泛型的基本使用》这篇文章中遗留以下问题,即将子类型也能添加到父类型的泛型中,要实现这种功能必须借助于协变。 实验准备   现在在上篇文章展示的Decorator类型的基础上,增加一些代码,如代码清单1所示。 代码清单1 /** * * 描 述:Exp2使用br/> * 作 者:jiaan.gja * 历 史: (版
谈谈对java平台的理解
从接触java到开发到现在,你对java最直观的印象是什么呢?是它宣传的“write once,run anywhere”,还是目前看已经有些过于形式主语的语法呢?你对于java平台到底了解到什么程度?请先停下来总结思考一下。今天要讨论的是,谈谈你对java平台的理解,“java是解释执行”,这句话对吗?典型的回答是:java本省是一种面向对象的语言,最显著地特性有两个方面,以是所谓的一次书写,到...
C#泛型的协变和抗变
首先我们都知道父类对象可以指向子类对象     class Document     {       }     class OperationGuide:Document     {     } 那么就可以写成 Document doc = new OperationGuide(); 但如果用于泛型就不行了,例如我写一个泛型类,那么就不能这样写了,会报一
我对“Stay hungry,Stay foolish”的理解
今年四月,xyzLove读到了一篇在网络上广为流传的史蒂夫·乔布斯(Steve Jobs)先生的演讲纪录——《乔布斯:2005年斯坦福演讲》。在演讲的最后,乔布斯先生讲述了自己年轻时曾读到过一本非常棒的杂志——斯图尔特·布兰德先生创办的《全球目录》,并将该杂志最后一期的封底上印的
个人对webdriver的理解(十)
selenium通过命令进行驱动,其中一种风格就是action(动作)。actions命令一般用于操作应用程序的状态,通过“点击”和“选择”的方式进行工作。webdriver继承了selenium中的actions类,这个actions类中,主要是模拟用户的鼠标mouse,键盘keyboard操作。对于这些操作,使用perform()方法进行执行。 对于前面说过的一些方法使用
第四章-实验
实验目的和要求 了解成员函数的特性,掌握静态成员、友元等概念。 实验内容 1、调试下列程序,写出输出结果,并分析输出结果。 //sy4_1.cpp #include<iostream> using namespace std; class My { public: My(int aa) { ...
只有淡季的思想,没有淡季的市场
        在上个世纪90年代前后,一般来讲,每年的6至8月是洗衣机销售的“淡季”。每到这个季节,很多厂家就把自己安排在商场里的促销员撤回去了,大量积压的产品也只好放在库里,等待旺季的到来。这让人感到纳闷儿:难道天气越热,出汗越多,老百姓反而就越不洗衣服了?细心的海尔人通过调查分析后发现,夏天人们并不是不需要洗衣机洗衣,恰恰相反,在这个时节人们洗衣服洗得最勤,最需要洗衣机洗衣。那么“死结”在哪