可重入锁:与同步锁(Synchronize)语义行为基本相同,但有更强大的功能
获取锁公平设置、测试锁 tryLock 、锁的获取顺序等等。
构造方法:
1.ReentrantLock()//创建一个可重入锁
2.ReentrantLock(boolean fair)//带公平策略锁,默认为false,是种非公平模式。
常用方法:
1.void lock() 请求加锁
2.void unlock() 尝试释放该锁
3.Boolean tryLock() 尝试获得锁,仅在无其他线程持有锁时得到该锁
4.int getHoldCount() 由当前线程持有,锁数。
5.protected Thread getOwner()
6.protected Collection<Thread> getQueuedThreads() 返回试图获得该锁的线程集合
7.Boolean isHeldCurrentThread() 判断锁是否被当前线程持有
8.Boolean isLocked() 查看锁是否被持有。
自己实现:
public class Man {
volatile static int i=0;
private Lock lock;
public Man(){
lock = new ReentrantLock();
}
public void eat(){
System.out.println("人吃饭..."+i);
}
public void work(){
System.out.println("人工作..."+i);
}
public void sleep(){
System.out.println("人睡觉..."+i);
}
public void life(){
lock.lock();
eat();
work();
sleep();
try{
}catch (Exception e){
}finally {
lock.unlock();
}
}
}
-----------------------------------------------------------------
public class Reentrant {
@Test
public void Test() {
ExecutorService executor = new ThreadPool().getCachedThreadPool();
Man man = new Man();
for(int i=0;i<4;i++){
executor.execute(new Runnable() {
@Override
public void run() {
man.life();
Man.i++;
}
});
}
executor.shutdown();
try {
executor.awaitTermination(1,TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}