java线程同步问题(synchronized)

publicclassThreadTest2extendsThread{privateintthreadNo;privateStringlock;publicThread... public class ThreadTest2 extends Thread
{
private int threadNo; private String lock;
public ThreadTest2(int threadNo, String lock)
{
this.threadNo = threadNo;
this.lock = lock;
}
public static void main(String[] args) throws Exception
{
String lock = new String("lock");
for (int i = 1; i < 5; i++)
{
new ThreadTest2(i, lock).start();
}
}
public void run()
{
synchronized (lock)
{
for (int i = 1; i < 5; i++)
{
System.out.println("No." + threadNo + ":" + i);
try
{
sleep(200);
}
catch(InterruptedException e){}
}
}
}
}
请问lock是共享资源吗?String是变量类型,传过去是值而不是引用,为什么所有的线程能把它当做是共享资源?
不过要是把synchronized去掉,输出结果就不一样了。
展开
 我来答
JesChou
2011-04-29 · TA获得超过1431个赞
知道小有建树答主
回答量:284
采纳率:0%
帮助的人:384万
展开全部
在java中除了8中基本数据类型,其余的参数传递全部是引用传递
你只定义一了lock,当然四个线程都是使用了同一个lock
因此lock可以当做"锁"来使用
每个线程执行到synchronized (lock)时,都会去申请lock的锁(每个对象都有一个唯一的锁)
申请到了才能执行synchronized 语句块里的内容,执行完了会释放lock的锁
没有申请到锁的线程会等待(lock有一个等待队列),处于阻塞状态,当有线程用完了锁就会唤醒一个在等待lock锁的一个线程...
追问
在run中,lock是TreadTest2的成员,每个线程就是一个对象,线程执行到synchronized时,lock分别属于线程自己的。我对“synchronized块”(注意是“块”)的理解是,只要他锁的对象是共享资源,也就是同一片内存,它才会同步,才会也别的对象互斥。但对于每一个线程lock是不同的内存的。
追答
你传递进去的lock只是一个引用而已,并不是复制一份给它
在java中除了8中基本数据类型,其余的参数传递全部是引用传递

虽然几个线程都有lock,但都是指向同一个lock
不信的话,你在每个线程内加一句System.out.println(lock.hashCode());,看看是不是一样的
别致且昂扬灬饼子3985
2011-04-29 · 超过14用户采纳过TA的回答
知道答主
回答量:65
采纳率:0%
帮助的人:43.6万
展开全部
synchronize那里是临界区的意思,就是每次只能一个线程就去。
去掉了,结果当然不一样了。
可以去java编程思想 看看21章并发好好看看,讲的很详细。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友42905dd
2011-04-29 · TA获得超过113个赞
知道答主
回答量:165
采纳率:0%
帮助的人:83.5万
展开全部
因为lock是在main方法中声明的,并传了过去,而在new ThreadTest2(i, lock).start();中并没有将lock new成其它对象,如lock = new String("...");
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zssazrael
2011-04-29
知道答主
回答量:21
采纳率:0%
帮助的人:2.2万
展开全部
String 传的是引用,而不是值,只是由于 String 是不能修改的,与基本类型相似,所以有人把 String 误认为与基本类型一样是传值
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式