`

Lock的实现原理

阅读更多
两种加锁方式:

Synchronized(obj){do logic}:尝试获取obj的锁,如果无法获取则阻塞等待;

Lock:它的实现原理和Synchronized完全不同,它使用compare and swap理念,如果符合cas判定逻辑,那么就修改state状态,把当前线程设定为独占,具体代码为:
        /**
         * Performs lock.  Try immediate barge, backing up to normal
         * acquire on failure.
         */
        final void lock() {
            if (compareAndSetState(0, 1))
                setExclusiveOwnerThread(Thread.currentThread());
            else
                acquire(1);
        }


无法获取锁的话,那么就:
    public final void acquire(int arg) {
        if (!tryAcquire(arg) &&
            acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
            selfInterrupt();
    }


但是为啥tryAcquire直接抛出异常说UnsupportedOperationException呢,不明白
    protected boolean tryAcquire(int arg) {
        throw new UnsupportedOperationException();
    }


Lock很重要的一个方面是它可以tryLock,试图获取不成的话可以不用阻塞,Synchronized的话那就等吧,等着cpu调度到你这个线程,你就可以做事了。

AtomicInteger实现原子性的原理如下:
    /**
     * Atomically increments by one the current value.
     *
     * @return the updated value
     */
    public final int incrementAndGet() {
        for (;;) {
            int current = get();
            int next = current + 1;
            if (compareAndSet(current, next))
                return next;
        }
    }


一、get()获取的是本地private volatile int value,这样保证可见性;
二、如果内存中的值是current,则设置为next
三、如果if (compareAndSet(current, next))返回false,看到for (;;)了吗?其他线程修改完了不就等到我了吗,O(∩_∩)O哈哈~


分享到:
评论

相关推荐

    Java synchronized关键字和Lock接口实现原理

    主要介绍了Java synchronized关键字和Lock接口实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    java的Lock锁原理详解.docx

    而lock是用java类,用java可以实现 2.synchronized可以锁住代码块,对象和类,但是线程从开始获取锁之后开发者不能进行控制和了解;lock则用起来非常灵活,提供了许多api可以让开发者去控制加锁和释放锁等等。

    看看C#中用lock关键实现同步的原理

    看看C#中用lock关键实现同步的原理, 虽然不长,但是很有用

    synchronized和LOCK的实现原理深入JVM锁机制比较好.docx

    synchronized和LOCK的实现原理深入JVM锁机制比较好.docx

    Java Lock接口实现原理及实例解析

    主要介绍了Java Lock接口实现原理及实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Lock锁的底层原理完整版

    此外,Lock接口还有一个带条件的锁——Condition接口的实现类ReentrantLock。这种带条件的锁使得线程可以在一定条件下挂起等待,直到其它线程唤醒它。 在实际使用场景中,例如多个用户同时操作一个银行账户的情况,...

    C++11中的mutex, lock, condition variable实现分析

    C++11中的各种mutex, lock对象,实际上都是对posix的mutex,condition的封装。不过里面也有很多细节值得学习。  std::mutex  先来看下std::mutex:  包增了一个pthread_mutex_t __m_,很简单,每个函数该干嘛...

    Java并发编程原理与实战

    JDK5提供的原子类的操作以及实现原理.mp4 Lock接口认识与使用.mp4 手动实现一个可重入锁.mp4 AbstractQueuedSynchronizer(AQS)详解.mp4 使用AQS重写自己的锁.mp4 重入锁原理与演示.mp4 读写锁认识与原理.mp4 细读...

    locks框架:接口.pdf

    介绍 ReentrantLock 的实现原理。 Condition 条件变量: 介绍 Lock 接口中的 Condition,它可以实现更复杂的线程等待和通知机制。解释如何使用 await、signal 和 signalAll 方法。 通过这份资源,您将获得关于 Locks...

    odoo定时任务task的实现方式

    odoo定时任务task的实现方式,通过文档分享帮助您了解并实现odoo中的定时任务

    龙果 java并发编程原理实战

    第19节JDK5提供的原子类的操作以及实现原理00:27:10分钟 | 第20节Lock接口认识与使用00:19:54分钟 | 第21节手动实现一个可重入锁00:26:31分钟 | 第22节AbstractQueuedSynchronizer(AQS)详解00:49:04分钟 | 第23...

    Java-并发(Concurrent)编程

    4,多线程在JVM中的实现原理剖析 导语: 什么是多线程? 多线程(multithreading)是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而...

    Java 并发编程原理与实战视频

    第19节JDK5提供的原子类的操作以及实现原理00:27:10分钟 | 第20节Lock接口认识与使用00:19:54分钟 | 第21节手动实现一个可重入锁00:26:31分钟 | 第22节AbstractQueuedSynchronizer(AQS)详解00:49:04分钟 | 第23...

    84、智能指针的原理、常用的智能指针及实现.pdf

    动态分配的资源,交给⼀个类对 象去管理,当类对象声明周期结束时,⾃动调⽤析构函数释放资源 常⽤的智能指针 (1) shared_ptr 实现原理:采⽤引⽤计数器的⽅法,允许多个智能指针指向同⼀个对象,每当多⼀个指针指向...

    java7源码-distributed-lock:分布式锁

    今天就来聊聊分布式锁这块的知识,先具体的来看看Redis分布式锁的实现原理。 如果在公司里落地生产环境用分布式锁的时候,一定是会用开源类库的,比如Redis分布式锁,一般就是用Redisson框架就好了,非常的简便易用...

    c_safe_lib:c数据结构线程安全库

    跨平台 linux 、windows实现原理功能状态实现原理list实现中双向循环链表rfifo基本实现环形队列queue实现中普通的队列构建方式构建该项目需要gcc版本>=4.6 主要原因是该项目中使用了内存屏障实现lock free注意:这个...

    摸鱼神器,模拟键盘输入,防止锁屏

    防止电脑自动锁屏,可以实现长期挂机摸鱼。 实现原理是通过模拟键盘点击numlock键,每50秒点击一次,循环24小时。代码简单,可以自行用记事本打开去修改。

    锁屏LockPattern

    锁屏界面实现原理及代码,可以修改定制自己的锁屏界面。使之个性化。

    java并发编程面试题

    java并发编程 基础知识,守护线程与线程, 并行和并发有什么区别? 什么是上下文切换?...ReentrantLock(重入锁)实现原理与公平锁非公平锁区别什么是可重入锁(ReentrantLock)? ThreadLocal内存泄漏分析与

Global site tag (gtag.js) - Google Analytics