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

王若冲 发布于 2011/07/12 11:43
阅读 889
收藏 0

程序代码如下:

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,但从输出结果看不是这样,还望各位大侠不吝赐教:>

加载中
0
wygzjie
wygzjie

引用来自“王若冲”的答案

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

我想你误解了锁的意思了
wygzjie
wygzjie
@王若冲: 我觉得吧,锁应该理解为一个令牌,不是传统意义上的锁。rest方法是需要获取令牌的,而构造方法并不需要获取令牌,所以两个并不会相互影响
未央
未央
@王若冲: 他的意思是,你给synchronized void rest() 这个方法加了锁,仅仅是防止了多个线程进入synchronized void rest() 这个方法,并不能让所有的线程都等待Thread1 休眠完毕后再恢复。
wygzjie
wygzjie
@王若冲: 程序运行的结果证明了你的理解是错的啊
王若冲
王若冲
@wygzjie: 可是class对象就是用来构造类的对象的呀。我的理解是这样啊,就是在thread1 rest的时候,给Thread1.class对象加了锁,那么这个时候如果线程thread2试图调用Thread1的构造器去构造thead1对象时,它不是应该要获得Thread1.class对象吗?而此时class对象已被thread1加了锁,所以thread2只能阻塞。不知道这样理解对不对?
wygzjie
wygzjie
@王若冲: 给Thread1.class加了锁,并不是说跟类相关的操作都没有办法执行,而是当其他线程想要获得这个锁的时候线程阻塞。构造方法并没有要去获得锁,所以还是可以执行
下一页
0
freish
freish

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

0
王若冲
王若冲

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

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