开发者社区> 怒放de生命> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

java并发原理实战(9)--手动实现一个可重入锁

简介: java并发原理实战(9)--手动实现一个可重入锁
+关注继续查看

自定义个锁


import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;


public class MyLock implements Lock {
    private boolean islock = false;
    Thread lockBy = null;
    int lockCount = 0;
    @Override
    public synchronized void lock() {
        Thread currentThread = Thread.currentThread();
        while (islock && lockBy != currentThread){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        lockBy = Thread.currentThread();
        islock = true;
        lockCount++;
    }
    @Override
    public synchronized void unlock() {
        if (lockBy == Thread.currentThread()){
            lockCount--;
           if (lockCount == 0){
               islock = false;
               notify();
           }
        }
    }
    @Override
    public void lockInterruptibly() throws InterruptedException {
    }
    @Override
    public boolean tryLock() {
        return false;
    }
    @Override
    public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
        return false;
    }
    @Override
    public Condition newCondition() {
        return null;
    }
}


测试:线程安全


public class Sequence {
    private  int value;
    MyLock lock = new MyLock();
    public  int getNext() {
        lock.lock();
        value++;
        lock.unlock();
        return value;
    }
    public static void main(String[] args) {
        Sequence sequence = new Sequence();
        new Thread(() -> {
                while (true) {
                    System.out.println(Thread.currentThread().getName() + " " + sequence.getNext());
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        ).start();
        new Thread( () -> {
                while (true) {
                    System.out.println(Thread.currentThread().getName() + " " + sequence.getNext());
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        ).start();
        new Thread( () -> {
                while (true) {
                    System.out.println(Thread.currentThread().getName() + " " + sequence.getNext());
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        ).start();
    }
}


运行结果:


1dc618a0ed9580ce8bfa6facb208c08f.png

结果显示:线程安全


测试:是否可重入


public class Demo {
    MyLock lock = new MyLock();
    public synchronized void a() {
        lock.lock();
        System.out.println("a");
        b();
        lock.unlock();
    }
    public synchronized void b() {
        lock.lock();
        System.out.println("b");
        lock.unlock();
    }
    public static void main(String[] args) {
        Demo d = new Demo();
        new Thread(()-> {
            d.a();
        }).start();
    }
}


运行结果:


5d4c6812c8535adbb050f4ddf2e1bce8.png


结果证明: a方法和b方法都可以进入了,是可重入锁。



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【Java技术专题】「原理专题」深入分析Java中finalize方法的作用和底层原理
【Java技术专题】「原理专题」深入分析Java中finalize方法的作用和底层原理
0 0
【Java难点攻克】「NIO和内存映射性能提升系列」彻底透析NIO底层的内存映射机制原理与Direct Memory的关系
【Java难点攻克】「NIO和内存映射性能提升系列」彻底透析NIO底层的内存映射机制原理与Direct Memory的关系
0 0
【Java技术指南】「原理剖析」Semaphore工作原理分析
【Java技术指南】「原理剖析」Semaphore工作原理分析
0 0
【Java技术指南】「原理剖析」synchronized工作原理分析
【Java技术指南】「原理剖析」synchronized工作原理分析
0 0
【Java技术指南】「序列化系列」深入挖掘FST快速序列化压缩内存的利器的特性和原理
【Java技术指南】「序列化系列」深入挖掘FST快速序列化压缩内存的利器的特性和原理
0 0
【Java技术指南】「并发编程专题」Fork/Join框架基本使用和原理探究(原理篇)
【Java技术指南】「并发编程专题」Fork/Join框架基本使用和原理探究(原理篇)
0 0
【Java技术指南】「并发编程专题」CompletionService框架基本使用和原理探究(基础篇)
【Java技术指南】「并发编程专题」CompletionService框架基本使用和原理探究(基础篇)
0 0
【Java技术指南】「并发编程专题」Fork/Join框架基本使用和原理探究(基础篇)
【Java技术指南】「并发编程专题」Fork/Join框架基本使用和原理探究(基础篇)
0 0
【Java原理探索】「OpenJDK专题」想不想编译属于你自己的JDK呢?(Windows10环境)
【Java原理探索】「OpenJDK专题」想不想编译属于你自己的JDK呢?(Windows10环境)
0 0
【Java原理探索】「编译器专题」重塑认识Java编译器的执行过程(常量优化机制)!
【Java原理探索】「编译器专题」重塑认识Java编译器的执行过程(常量优化机制)!
0 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
JAVA反射原理以及一些常见的应用
立即下载
Java工程师必读手册
立即下载
Java应用提速(速度与激情)
立即下载