请大家帮解释以下代码的输出结果,其中synchronized的加锁对象是?

发布于 2021-11-06 22:56:10 字数 1294 浏览 899 评论 9

程序代码如下:

import org.omg.CORBA.PUBLIC_MEMBER;

 

public class TestThread {

public static void main(String[] args)
{

Thread1 thread1=new Thread1("Thread1");
Thread2 thread2=new Thread2("Thread2");

System.out.println("***********************************以下是两线程运行输出结果***********************************");

thread1.start();

thread2.start();

}

}

 

class Thread1 extends Thread

{

public Thread1(String name)

{

this.setName(name);

System.out.println("线程"+this.getName()+"构造完毕!");

}

public synchronized static void rest()

{

System.out.println("Thread1.class类休息!");

try {

sleep(10);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

 

public void run()

{

rest();

System.out.println("线程"+this.getName()+"结束!");

}

}

 

class Thread2 extends Thread

{

public Thread2(String name)

{

this.setName(name);

}

public void run()

{

Thread1 thread1=new Thread1("Thead2_Thread1");

}

}

输出结果:

线程Thread1构造完毕!

*****以下是两线程运行输出结果*****

Thread1.class类休息!

线程Thead2_Thread1构造完毕!

线程Thread1结束!

 

补充:本来我以为synchronized关键字加锁对象是Thread1.class,但从输出结果看不是这样,还望各位大侠不吝赐教:>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

掩饰不了的爱 2021-11-12 04:31:24

昨天又问了下同学,也说是执行构造函数不需要class对象?可为什么呢?class对象不是用来构造类的常规对象的吗?那么class对象跟类的常规对象的构造之间又是什么关系呢?劳烦各位大侠解释下,呵呵。

心舞飞扬 2021-11-12 04:31:14

本来我也以为是这样,不过如果这样的话,在thread1中调用rest方法期间,thread2应该是阻塞呀?因为thread1 rest的时候,thread1给Thread1.class对象加了锁,那么在thread2中的构造方法还能执行吗?

夜无邪 2021-11-12 04:30:33

静态方法是所在类的Class对象

想挽留 2021-11-12 04:25:42

@王若冲: 给Thread1.class加了锁,并不是说跟类相关的操作都没有办法执行,而是当其他线程想要获得这个锁的时候线程阻塞。构造方法并没有要去获得锁,所以还是可以执行

为你鎻心 2021-11-11 22:27:19

@wygzjie: 可是class对象就是用来构造类的对象的呀。我的理解是这样啊,就是在thread1 rest的时候,给Thread1.class对象加了锁,那么这个时候如果线程thread2试图调用Thread1的构造器去构造thead1对象时,它不是应该要获得Thread1.class对象吗?而此时class对象已被thread1加了锁,所以thread2只能阻塞。不知道这样理解对不对?

噩梦成真你也成魔 2021-11-11 00:21:24

@王若冲: 程序运行的结果证明了你的理解是错的啊

蓝颜夕 2021-11-10 23:52:49

@王若冲: 他的意思是,你给synchronized void rest() 这个方法加了锁,仅仅是防止了多个线程进入synchronized void rest() 这个方法,并不能让所有的线程都等待Thread1 休眠完毕后再恢复。

尐偏执 2021-11-10 14:17:03

@王若冲: 我觉得吧,锁应该理解为一个令牌,不是传统意义上的锁。rest方法是需要获取令牌的,而构造方法并不需要获取令牌,所以两个并不会相互影响

醉酒的小男人 2021-11-08 22:33:01

本来我也以为是这样,不过如果这样的话,在thread1中调用rest方法期间,thread2应该是阻塞呀?因为thread1 rest的时候,thread1给Thread1.class对象加了锁,那么在thread2中的构造方法还能执行吗?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文