黑马程序员技术交流社区
标题:
关于同步的问题
[打印本页]
作者:
JarryHorse
时间:
2015-4-26 22:05
标题:
关于同步的问题
Lock类可以实现锁的功能,那么问题来了,synchronized可以指定锁对象,如果说Lock本身就是锁对象的话,在线程间通讯的时候,为什么使用同一个Lock对象lock两个方法内的代码,但这两个代码是可以同时执行的。
/*
需求:演示Lock类和线程间通讯
*/
import java.util.concurrent.locks.*;
//封装了主函数的类
class ThreadDemo
{
//主函数
public static void main(String[] args)
{
//创建Runnable子类对象,在构造函数中传入
Data data = new Data();
//创建两个线程对象,在构造函数传入同一个Runnable子类对象
new Thread(new TrueData(data)).start();
new Thread(new FalseData(data)).start();
}
}
//用实现Runnable接口的方法创建类
class TrueData implements Runnable
{
private Data data;
TrueData(Data data)
{
this.data = data;
}
public void run()
{
data.on();
}
}
//用实现Runnable接口的方法创建类
class FalseData implements Runnable
{
private Data data;
FalseData(Data data)
{
this.data = data;
}
public void run()
{
data.off();
}
}
class Data
{
private int num = 1;
private boolean logic = true;
//定义两个同步代码块的锁对象
private Lock lock = new ReentrantLock();
private Condition cona = lock.newCondition();
private Condition conb = lock.newCondition();
public void on()
{
while(true)
{
try
{
lock.lock();
if (logic)
{
cona.await();
}
num = 1;
logic = true;
//打印语句
System.out.println("Logic on..."+"num:"+num+" logic:"+logic);
conb.signal();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
finally
{
lock.unlock();
}
}
}
public void off()
{
while(true)
{
try
{
lock.lock();
if(!logic)
conb.await();
num = 0;
logic=false;
//打印语句
System.out.println("Logic off......"+"num:"+num+" logic:"+logic);
cona.signal();
}
catch (InterruptedException e)
{
e.printStackTrace();
}
finally
{
lock.unlock();
}
}
}
}
复制代码
像这样,线程在同步中wait了,为什么另一个线程可以执行同步内的代码,难道当前线程wait的时候会释放此锁么?看API中貌似没有这样的描述,困惑,请大神解答
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2