java 锁 Lock 简单学习

公平锁和非公平锁:区别在于是否会检查线程队列并且从线程队列(双端队列)首获取线程锁;公平锁-在每次获取锁时会检查线程队列是否还有线程,若有则从队列首获取线程并加锁。非公平锁-对于线程获取锁是随机的,并不会去从队列首去获取锁,新进线程有很大几率获取到锁。

   Lock:java 提供的一种锁区别于JVM提供的synchronized,并提供了多种获取锁的方式.简单分为:ReentrantLock:可重入锁、ReentrantLockReadWriteLock.readLock():读锁、ReentrantReadWriteLock.writeLock():写锁。

       ReentrantLock:可重入锁:意思是一个线程可重复的对一个资源进行加锁。具有排他性,同一时间仅允许一个线程访问资源。具体实现形式:

       使用Lock与synchronized  使用区别在于Lock需要手动获取并最终在finally中手动释放锁synchronized:发生异常JVM会自动释放锁。

       

         ReentrantReadWriteLock:读写锁 :在同一时间允许多个线程访问资源,但是在进行读写操作时仅允许一个线程操作,当一个线程在进行读操作时其他读线程阻塞,在进行写操作时其他写线程阻塞。从而提高并发量,实现了可重入、高并发、公平性以及锁降级(持有读锁时再去获取写锁,再释放读锁)。具体实现:

        



     Lock:重入锁、读写锁均提供了以下方法:

                lock():获取锁。

扫描二维码关注公众号,回复: 1575777 查看本文章

                trylock():只有在调用时它是空闲的,才获得锁。如果它是可用的,就获得锁,并立即返回值为true。如果锁不可用,那么这个方法将立即返回值为false。

                  tryLock(long time, TimeUnit unit):如果在给定时间内锁时可用的,则获取锁,否则阻塞该线程,并处于休眠状态。当出现以下三种情况时重新获取:

                     锁被当前线程获取;

                           其他一些线程中断当前线程,并支持锁获取的中断;

                           指定的等待时间流逝

                   lockInterruptibly():获得锁,除非当前线程被阻断。如果锁不可用则线程禁用处于休眠状态,直到出现以下情况:

                        锁被当前线程获取

                        其他一些线程中断了当前线程,并且支持锁获取的中断。

                   unlock():释放锁。

        condition:线程间通信同object中的wait(),notify()...等方法类似。不同在于condition:在多线程下可以根据指定情况操作线程,例如当启动读线程时,可以唤醒对应的写线程(一个线程读一个线程写)。

        

        ReentrantLock与ReentrantReadWriteLock:多线程时,线程对资源的访问,以及并发性能问题区别。

        ReentrantLock与synchronized:区别在于锁的策略不同,synchronized使用悲观的策略,当有一个线程尝试获取锁,若未获取到锁,则线程阻塞。ReentrantLock:则使用乐观的策略,当一个线程尝试获取锁失败时并不会立即阻塞该线程,而是不停的去尝试获取锁,直到成功。阻塞线程再唤醒线程会消耗CPU降低性能。与valitale的区别在于valitale会增加数据的透明性,强制线程清空本地内存去主内存中读取数据,改变变量强制刷新到主内存


猜你喜欢

转载自blog.csdn.net/qq_28834183/article/details/80430494
今日推荐