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去掉,输出结果就不一样了。 展开
{
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去掉,输出结果就不一样了。 展开
展开全部
在java中除了8中基本数据类型,其余的参数传递全部是引用传递
你只定义一了lock,当然四个线程都是使用了同一个lock
因此lock可以当做"锁"来使用
每个线程执行到synchronized (lock)时,都会去申请lock的锁(每个对象都有一个唯一的锁)
申请到了才能执行synchronized 语句块里的内容,执行完了会释放lock的锁
没有申请到锁的线程会等待(lock有一个等待队列),处于阻塞状态,当有线程用完了锁就会唤醒一个在等待lock锁的一个线程...
你只定义一了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());,看看是不是一样的
展开全部
synchronize那里是临界区的意思,就是每次只能一个线程就去。
去掉了,结果当然不一样了。
可以去java编程思想 看看21章并发好好看看,讲的很详细。
去掉了,结果当然不一样了。
可以去java编程思想 看看21章并发好好看看,讲的很详细。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为lock是在main方法中声明的,并传了过去,而在new ThreadTest2(i, lock).start();中并没有将lock new成其它对象,如lock = new String("...");
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
String 传的是引用,而不是值,只是由于 String 是不能修改的,与基本类型相似,所以有人把 String 误认为与基本类型一样是传值
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询