Java并发编程-重入锁
例子:
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
new Thread(new Runnable() {
public void run() {
synchronized (this){
System.out.println("线程: "+Thread.currentThread().getName()+" 第一次获取锁,这个锁是:"+this);
int i =0;
for(;;){
synchronized (this){
System.out.println("线程: "+Thread.currentThread().getName()+" 第"+(++i)+"次获取锁,这个锁是:"+this);
}
if(i == 10){
break;
}
}
}
}
}).start();
}
}
运行结果:
线程: Thread-0 第一次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@3abbf4ae
线程: Thread-1 第一次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@1667513b
线程: Thread-0 第1次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@3abbf4ae
线程: Thread-1 第1次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@1667513b
线程: Thread-0 第2次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@3abbf4ae
线程: Thread-1 第2次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@1667513b
线程: Thread-0 第3次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@3abbf4ae
线程: Thread-1 第3次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@1667513b
线程: Thread-0 第4次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@3abbf4ae
线程: Thread-1 第4次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@1667513b
线程: Thread-0 第5次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@3abbf4ae
线程: Thread-1 第5次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@1667513b
线程: Thread-0 第6次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@3abbf4ae
线程: Thread-1 第6次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@1667513b
线程: Thread-0 第7次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@3abbf4ae
线程: Thread-1 第7次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@1667513b
线程: Thread-0 第8次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@3abbf4ae
线程: Thread-1 第8次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@1667513b
线程: Thread-1 第9次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@1667513b
线程: Thread-1 第10次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@1667513b
线程: Thread-0 第9次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@3abbf4ae
线程: Thread-0 第10次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@3abbf4ae
线程: Thread-2 第一次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@245c3ee2
线程: Thread-2 第1次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@245c3ee2
线程: Thread-2 第2次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@245c3ee2
线程: Thread-2 第3次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@245c3ee2
线程: Thread-2 第4次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@245c3ee2
线程: Thread-2 第5次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@245c3ee2
线程: Thread-2 第6次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@245c3ee2
线程: Thread-2 第7次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@245c3ee2
线程: Thread-2 第8次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@245c3ee2
线程: Thread-2 第9次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@245c3ee2
线程: Thread-2 第10次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@245c3ee2
线程: Thread-3 第一次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@469add4e
线程: Thread-3 第1次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@469add4e
线程: Thread-3 第2次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@469add4e
线程: Thread-3 第3次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@469add4e
线程: Thread-3 第4次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@469add4e
线程: Thread-3 第5次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@469add4e
线程: Thread-3 第6次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@469add4e
线程: Thread-3 第7次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@469add4e
线程: Thread-3 第8次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@469add4e
线程: Thread-3 第9次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@469add4e
线程: Thread-3 第10次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@469add4e
线程: Thread-4 第一次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@14e1774
线程: Thread-4 第1次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@14e1774
线程: Thread-4 第2次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@14e1774
线程: Thread-4 第3次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@14e1774
线程: Thread-4 第4次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@14e1774
线程: Thread-4 第5次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@14e1774
线程: Thread-4 第6次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@14e1774
线程: Thread-4 第7次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@14e1774
线程: Thread-4 第8次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@14e1774
线程: Thread-4 第9次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@14e1774
线程: Thread-4 第10次获取锁,这个锁是:com.wf.lock.RenntrantLockTest$1@14e1774
运行结果分析:
从结果上看,一个线程可以多次获取相同的锁并且不阻塞。
synchronized和ReentrantLock都是可以重入锁的。
ReentrantLock重入锁源码:
protected final boolean tryAcquire(int acquires) {
final Thread current = Thread.currentThread();
int c = getState();
if (c == 0) {
if (!hasQueuedPredecessors() &&
compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);
return true;
}
}
//通过判断当前线程是否为获取锁的线程来决定获取操作是否成功,如果是获取锁的线程再次请求,则将同步状态值进行增加并返回true,标识获取同步锁成功。
else if (current == getExclusiveOwnerThread()) {
int nextc = c + acquires;
if (nextc < 0)
throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
return false;
}