1.互斥锁:
当多个线程访问同一共有变量,控制线程执行顺序时。
加锁解锁为一个完整的周期。
ps:在本示例中,只有当第一个线程先调用setID(int ID)方法给共有变量ID赋值后,第二个线程才能去调用getID()获取ID值。第二个线程最后应将ID=0,便于下次使用。
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 线程锁:赋值和获取ID
* @author _Yuan
*/
public class GetInfoId {
public static int ID;//共有变量
private ReentrantLock lock = new ReentrantLock();//互斥锁
boolean state = true;
//给ID赋值的的时候加锁,并改变状态,赋完值后解锁
public void setID(int ID) {
lock.lock();// 上锁
try {
if (state) {
GetInfoId.ID = ID;
state = false;// 改变状态
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();// 释放锁
}
}
//取ID的时候先判断是否被锁,被锁就等待,没有锁就直接返回ID
public int getID() {
if (lock.isLocked() || state==true) {//信息正在上传lock.isLocked()或者还未上传都等待ID == 0,state==true
System.out.println("等待。。。");
try {
Thread.sleep(2000);//两秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
state = true;// 改变状态
return ID;
}
}
稍后有空会持续更新。。。