请大家帮解释以下代码的输出结果,其中synchronized的加锁对象是?
程序代码如下:
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
昨天又问了下同学,也说是执行构造函数不需要class对象?可为什么呢?class对象不是用来构造类的常规对象的吗?那么class对象跟类的常规对象的构造之间又是什么关系呢?劳烦各位大侠解释下,呵呵。
本来我也以为是这样,不过如果这样的话,在thread1中调用rest方法期间,thread2应该是阻塞呀?因为thread1 rest的时候,thread1给Thread1.class对象加了锁,那么在thread2中的构造方法还能执行吗?
静态方法是所在类的Class对象
@王若冲: 给Thread1.class加了锁,并不是说跟类相关的操作都没有办法执行,而是当其他线程想要获得这个锁的时候线程阻塞。构造方法并没有要去获得锁,所以还是可以执行
@wygzjie: 可是class对象就是用来构造类的对象的呀。我的理解是这样啊,就是在thread1 rest的时候,给Thread1.class对象加了锁,那么这个时候如果线程thread2试图调用Thread1的构造器去构造thead1对象时,它不是应该要获得Thread1.class对象吗?而此时class对象已被thread1加了锁,所以thread2只能阻塞。不知道这样理解对不对?
@王若冲: 程序运行的结果证明了你的理解是错的啊
@王若冲: 他的意思是,你给synchronized void rest() 这个方法加了锁,仅仅是防止了多个线程进入synchronized void rest() 这个方法,并不能让所有的线程都等待Thread1 休眠完毕后再恢复。
@王若冲: 我觉得吧,锁应该理解为一个令牌,不是传统意义上的锁。rest方法是需要获取令牌的,而构造方法并不需要获取令牌,所以两个并不会相互影响
本来我也以为是这样,不过如果这样的话,在thread1中调用rest方法期间,thread2应该是阻塞呀?因为thread1 rest的时候,thread1给Thread1.class对象加了锁,那么在thread2中的构造方法还能执行吗?