通过一些demo ,尝试理解juc包下的一些类的用法;
1. 使用ReentrantLock进行同步
说明:开启四个线程,每个线程首先去执行lock方法后,睡眠不同的时间后,最后执行unlock方法。

|
运行结果
—-come in A
当前正在排队的人数queueLength:3 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread A]
当前正在排队的人数queueLength:3 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread A]
当前正在排队的人数queueLength:3 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread A]
当前正在排队的人数queueLength:3 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread A]
当前正在排队的人数queueLength:3 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread A]
当前正在排队的人数queueLength:3 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread A]
当前正在排队的人数queueLength:3 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread A]
当前正在排队的人数queueLength:3 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread A]
当前正在排队的人数queueLength:3 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread A]
当前正在排队的人数queueLength:3 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread A]
当前正在排队的人数queueLength:3 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread A]
当前正在排队的人数queueLength:3 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread A]
当前正在排队的人数queueLength:3 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread A]
当前正在排队的人数queueLength:3 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread A]
当前正在排队的人数queueLength:3 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread A]
—-come in B
当前正在排队的人数queueLength:2 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread B]
当前正在排队的人数queueLength:2 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread B]
当前正在排队的人数queueLength:2 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread B]
当前正在排队的人数queueLength:2 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread B]
当前正在排队的人数queueLength:2 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread B]
当前正在排队的人数queueLength:2 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread B]
当前正在排队的人数queueLength:2 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread B]
当前正在排队的人数queueLength:2 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread B]
—-come in C
当前正在排队的人数queueLength:1 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread C]
当前正在排队的人数queueLength:1 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread C]
当前正在排队的人数queueLength:1 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread C]
当前正在排队的人数queueLength:1 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread C]
—-come in D
当前正在排队的人数queueLength:0 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread D]
当前正在排队的人数queueLength:0 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Locked by thread D]
当前正在排队的人数queueLength:0 当前持有锁的线程是:java.util.concurrent.locks.ReentrantLock@20ad9418[Unlocked]
2. 继承AQS实现自定义同步类之一
- 使用一个内部类继承抽象类
AbstractQueuedSynchronizer,并实现AQS的三个protected方法; - 引用上边定义的内部类,并使用内部类实现lock相关方法;
// 演示锁的实现 |
运行结果
Thread-1 is trying to lock…
Thread-2 is trying to lock…
Thread-1 has locked.
Thread-1 is unlocking.
Thread-2 has locked.
Thread-2 is unlocking.
// 注意:也能是Thread-2 先获取到锁
3. 继承AQS实现自定义同步类之二
// 演示wait notify |
运行结果
Waiter thread is waiting…
Main thread is signalling…
Waiter thread has been signalled!
Latch signalled state: true