这里并不介绍同步条件锁的具体定义,只对下面代码进行简单描述。本人最近在学有关知识,发现只有自己实际编码才能有深刻的体会,遇到问题才能更好的理解问题。由于i开始为10,所以线程0被阻塞,接着i被赋成100,线程1执行,完成后唤醒线程0(本段代码意图是体现锁条件,不足之处望赐教,实验室网速太卡,格式都没法调)
import java.util.Scanner;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class A {
public static int i=10;//定义个静态变量
private Lock bankLock; //一个锁对象
private Condition sufficientFunds; //一个条件对象
public A()
{
bankLock = new ReentrantLock();
sufficientFunds = bankLock.newCondition();
}
public void setI(int i)
{
this.i=i;
}
public void ff()
{
bankLock.lock();
try
{
while (this.i < 100)
sufficientFunds.await();/*如果锁条件不满足,该线程会被阻塞并释放锁,直到别的线程调用该对象的sufficientFunds.signalAll()方法*/
System.out.println(Thread.currentThread());
sufficientFunds.signalAll();
}
catch (InterruptedException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
finally
{
bankLock.unlock();
}
}
}
class B implements Runnable
{
public static A a=new A();//保证创建的线程都共享一个A类对象a
public void run() {
// TODO 自动生成方法存根
//A a=new A();
a.ff();
}
}
public class test
{
public static void main(String[] args)
{
Thread t=new Thread(new B());//创建一个线程
t.start();//启动线程
A m=new A();//新建一个对象
m.setI(100);//设置i的值,这里i设为静态变量,可以让多个对象共享。
Thread t1=new Thread(new B());//创建一个线程
t1.start();//启动该线程
}
}
程序输出:
Thread[Thread-1,5,main]
Thread[Thread-0,5,main]