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

问题描述

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

对象-JAVA多线程如何理解这句话?的相关文章

对象-初学者要怎样理解这句话?

问题描述 初学者要怎样理解这句话? 类名.静态方法,返回来的是一个对象? Thread.currentThread().getName() 解决方案 这行代码返回的是一个String类型的对象.Thread.currentThread()返回的是一个Thread类的实例,它的getName方法如下: public final String getName() { return new String(name, true); } 解决方案二: 这句话用语病,方法的返回结果是根据它的返回值类型决定的

对象-java中如何理解这个数据类型 List<Map<String, Object>>

问题描述 java中如何理解这个数据类型 List<Map<String, Object>> 话说我现在只能理解int void string long 等等基本数据类型呢 List> 是一个引用数据类型吗 应该如何理解呢 解决方案 这个变量本质是一个List类型,指定了List中的元素类型是Map ,这个是泛型,但是编译后会泛型擦除还原成List. 解决方案二: 1) 第一层,一个列表,可以用 类似于 list[i] 的方式来访问. 2) 第二层,这个列表中的每个元素都是一

理解java多线程中ExecutorService使用_java

java.util.concurrent包里提供了关于多线程操作的类,平常用的比较多的是ExecutorService及其实现类(如ThreadPoolExecutor等),Executor,Executors,Future,Callable等 1. ExecutorService(继承自Executor)接口:提供了一些异步的多线程操作方法,如execute(), submit(), shutdown(), shutdownNow()等 2. Executor接口:执行提交的任务(线程),只有

Java多线程的线程守护两个例子

  核心说明:理解这句话下面可以不看了. 守护与其他线程同时执行,当正在运行的线程都是守护线程时,Java 虚拟机退出. 守护线程与普通线程写法上基本么啥区别,调用线程对象的方法setDaemon(true),则可以将其设置为守护线程. 守护线程使用的情况较少,但并非无用,举例来说,JVM的垃圾回收.内存管理等线程都是守护线程.还有就是在做数据库应用时候,使用的数据库连接池,连接池本身也包含着很多后台线程,监控连接个数.超时时间.状态等等. setDaemon方法的详细说明: public fi

。。。。。这句话怎么理解?

问题描述 .....这句话怎么理解? private static Singleton instance = new Singleton(): 解决方案 Java里的单列代码 解决方案二: 如何通过这句话对可执行文件进行理解???下面这句话是什么意思??? 该怎么理解??? 解决方案三: private static Singleton instance = new Singleton(): 另一种写法: private static Singleton intence; //声明一个静态 Si

多线程控制问题?帮忙解释一下这句话什么意思。。。

问题描述 staticMutexm;staticThreadt1;staticThreadt2;staticvoidMain(string[]args){m=newMutex(true);//创建互斥对象t1=newThread(newThreadStart(p1));t2=newThread(newThreadStart(p2));t1.Start();t2.Start();Console.WriteLine("主线程开始运行");m.ReleaseMutex();//释放互斥对象T

请问“引用变量保持用于引用对象的位”这句话是什么意思?

问题描述 请问"引用变量保持用于引用对象的位"这句话是什么意思? 请问"引用变量保持用于引用对象的位"这句话是什么意思??????????????????????????? 解决方案 "位"?翻译错误吧,应该是"地址"或"指针"比较正确. 解决方案二: 引用变量就是对被引用变量的一个副本,它可以访问变量.

如何正确理解“内容为王,外链为皇”这句话

从seo这个行业兴起以来,"内容为王,外链为皇"这句话就成为seoer的真理,随着搜索引擎算法的不断升级,这个真理还那么管用吗?今天小编就和大家来分享一下这几个月实战的一些想法,可能对,希望能对你有所帮助,如果说的不对,大家就一笑了之.那么怎么理解"内容为王,外链为皇"呢? 首先先说说"内容为王"吧!内容对于一个网站,不管在任何情况下都是最重要的,所以"内容为王"这是永远都不会变的真理.内容是一个网站的核心,是网站的灵魂,拥有

Java多线程的同步示例及对象锁机制

java多线程的同步依靠的是对象锁机制,synchronized关键字的背后就是利用了封锁来实现对共享资源的互斥访问. 下面以一个简单的实例来进行对比分析.实例要完成的工作非常简单,就是创建10个线程,每个线程都打印从0到99这100个数字,我们希望线程之间不会出现交叉乱序打印,而是顺序地打印. 先来看第一段代码,这里我们在run()方法中加入了synchronized关键字,希望能对run方法进行互斥访问,但结果并不如我们希望那样,这 是因为这里synchronized锁住的是this对象,即