黑马程序员技术交流社区
标题:
线程,锁问题
[打印本页]
作者:
李江
时间:
2013-7-15 11:02
标题:
线程,锁问题
本帖最后由 杨兴庭 于 2013-7-15 21:21 编辑
<p>代码1:</p><p>public synchronized void set(String name)
{
while(flag)
try
{
this.wait();
}
catch (InterruptedException e)
{
}
this.name = name;
count++;
System.out.println(Thread.currentThread().getName()+name+"--生产--"+count);
flag = true;
this.notifyAll();
}</p>
复制代码
代码2:
public void set(String name) throws InterruptedException
{
lock.lock();
try
{ while(flag)
continue_pro.await();
this.name = name;
count++;
System.out.println(Thread.currentThread().getName()+name+"--生产--"+count);
flag = true;
continue_con.signal();
}
finally
{
lock.unlock();
}
复制代码
问题:
代码1中的锁是什么时候释放的,为什么不放在finally里面?
作者:
草貌路飞
时间:
2013-7-15 11:11
用synchronized这种同步方式是没有主动释放锁的方法的。要不就是它执行set中的代码时没有cup使用权了就释放给其它线程了。要不就是执行完set方法还有cpu执行时间,就又获得锁再执行,然后就会执行到wait那里,也就释放锁了
作者:
李江
时间:
2013-7-15 12:13
草貌路飞 发表于 2013-7-15 11:11
用synchronized这种同步方式是没有主动释放锁的方法的。要不就是它执行set中的代码时没有cup使用权了就释放 ...
恩恩,OK,谢谢你了
作者:
杨增坤
时间:
2013-7-15 21:05
synchronized(){代码}或者是
synchronized 方法名(){方法体}
当代码执行完成,或者是方法体执行完成 锁自定释放,当代码或者是方法体没有执行到最后则锁不会释放
当你进入执行代码或者进入方法体,那么就会自动加上锁。
希望对你有帮助!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2