多线程——5自定义显示锁

自定义显示锁

自定义显示锁思路

  1. 显示锁的实现主要使用了wait和notifyAll方法, 我们定义一个Boolean变量作为标志,同步lock方法里面首先判断当前锁是否被使用,如果被使用了自己加入一个等待队列(自定义一个集合)然后让自己wait, 如果没有被使用那么先把自己从等待队列移除, 可以直接把锁获取到设置bool值为true。
  2. 解锁方法:直接设置锁bool值为false然后notifyAll所有的等待线程
  3. 保证谁加的锁谁释放锁
  4. 注意:在等待synchronized的锁的线程使用interrupted是打不断的
  5. Synchronized 如果有线程需要这个锁会一直阻塞,但是自定义锁可以指定多久时间之后放弃请求锁

实现代码

public class BooleanBlock {
		// 是否已被锁住
		private boolean isBlock;
		// 当前等待的线程集合
		private Collection <Thread> blockThreads = new ArrayList<>();
		// 当前使用锁的线程
		private Thread curThread;
		
		public BooleanBlock() {
			isBlock = false;
		}
		
		public synchronized void lock() {
			while(isBlock) {
				this.blockThreads.add(Thread.currentThread());
				this.wait();
			}
			this.curThread = Thread.currentThread();
			this.blockThreads.remove(this.curThread);
			this.isBlock = true;
		}
		
		public synchronized void unlock() {
			if (Thread.currentThread() == curThread) {
				this.isBlock = false;
				this.notifyAll();
			}
		}
		
		
}
发布了11 篇原创文章 · 获赞 11 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/sui_feng_piao_guo/article/details/104422715