实现一个最基本的锁

首先要我们要确定这个锁的对象是否已经被锁了
用一个布尔类型的变量来确认是否被加锁了。
需要一个集合来存放那些还没得到锁,在等候锁的线程。
需要一个判断是否是当前的线程的对象。

private Thread currentThread;
private boolean locked = false;
private final List<Thread> blockedList = new ArrayList<>();

以上就是类的成员变量。

lock() 功能

修改布尔变量
判断是否别的已经获得了锁。
让当前的线程进入等待的队列。
SHOW THE CODE

public void lock() throws InterruptedException {
	synchronized (this) {
		while (locked) { // 判断是否已经被上锁了
			if (!blockedList.contains(Thread.currentThread())) {
				blockedList.add(Thread.currentThread());// 把当前的线程放入等待队列
			}
			this.wait(); //进入等待
		}
		blockedList.remove(currentThread);//在等待队列中移除,就算之前不在队列中也不影响
		this.locked = true;//设置布尔变量为true,表示已经被某个线程上了锁
		this.currentThread = Thread.currentThread();//设置锁中的线程为当前线程
	}
}

unlock()功能

判断是否加锁的那个线程
如果是,设置locked变量为false,表示当前的线程已经释放了锁了,唤醒别的所有在等待的线程。
SHOW THE CODE

@Override
public void unlock() {
	synchronized (this) {
		if(currentThread == Thread.currentThread()) {
			this.locked = false;
			this.notifyAll();
		} else {
			
		}
	}
}

完整的代码

package chapter05;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeoutException;

public class BooleanLock implements Lock {

	private Thread currentThread;
	private boolean locked = false;
	private final List<Thread> blockedList = new ArrayList<>();
	
	@Override
	public void lock() throws InterruptedException {
		synchronized (this) {
			while (locked) {
				if (!blockedList.contains(Thread.currentThread())) {
					blockedList.add(Thread.currentThread());
				}
				this.wait();
			}
			blockedList.remove(currentThread);
			this.locked = true;
			currentThread = Thread.currentThread();
		}
	}

	@Override
	public void lock(long mills) throws InterruptedException, TimeoutException {
		
	}

	@Override
	public void unlock() {
		synchronized (this) {
			if(currentThread == Thread.currentThread()) {
				this.locked = false;
				this.notifyAll();
			} else {
				
			}
		}
	}

	@Override
	public List<Thread> getBlockedThreads() {
		return null;
	}
}

以上是实现一个简陋的不能再简陋的锁了,希望你可以从中理解一些简单的锁的原理。

参考资料

《Java 高并发编程详解》副标题:多线程与架构设计

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值