首先要我们要确定这个锁的对象是否已经被锁了
用一个布尔类型的变量来确认是否被加锁了。
需要一个集合来存放那些还没得到锁,在等候锁的线程。
需要一个判断是否是当前的线程的对象。
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 高并发编程详解》副标题:多线程与架构设计

172万+

被折叠的 条评论
为什么被折叠?



