java线程同步问题(synchronized)

[复制链接]
查看11 | 回复2 | 2011-5-1 01:59:49 | 显示全部楼层 |阅读模式
publicclassThreadTest2extendsThread
{
privateintthreadNo;privateStringlock;
publicThreadTest2(intthreadNo,Stringlock)
{
this.threadNo=threadNo;
this.lock=lock;
}
publicstaticvoidmain(String[]args)throwsException
{
Stringlock=newString(\"lock\");
for(inti=1;i5;i)
{
newThreadTest2(i,lock).start();
}
}
publicvoidrun()
{
synchronized(lock)
{
for(inti=1;i5;i)
{
System.out.println(\"No.\"threadNo\":\"i);
try
{
sleep(200);
}
catch(InterruptedExceptione){}
}
}
}
}
请问lock是共享资源吗?String是变量类型,传过去是值而不是引用,为什么所有的线程能把它当做是共享资源?
回复

使用道具 举报

千问 | 2011-5-1 01:59:49 | 显示全部楼层
在java中除了8中基本数据类型,其余的参数传递全部是引用传递
你只定义一了lock,当然四个线程都是使用了同一个lock
因此lock可以当做\"锁\"来使用
每个线程执行到synchronized(lock)时,都会去申请lock的锁(每个对象都有一个唯一的锁)
申请到了才能执行synchronized语句块里的内容,执行完了会释放lock的锁
没有申请到锁的线程会等待(lock有一个等待队列),处于阻塞状态,当有线程用完了锁就会唤醒一个在等待lock锁的一个线程...









<h4class=\"ask\">追问


在run中,lock是TreadTest2的成员,每个线程就是一个对象,线程执行到synchronized时,lock分别属于线程自己的。我对“synchronized块”(注意是“块”)的理解是,只要他锁的对象是共享资源,也就是同一片内存,它才会同步,才会也别的对象互斥。但对于每一个线程lock是不同的内存的。
回复

使用道具 举报

千问 | 2011-5-1 01:59:49 | 显示全部楼层
你传递进去的lock只是一个引用而已,并不是复制一份给它
在java中除了8中基本数据类型,其余的参数传递全部是引用传递

虽然几个线程都有lock,但都是指向同一个lock
不信的话,你在每个线程内加一句System.out.println(lock.hashCode());,看看是不是一样的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行