Java多线程学习笔记(二)-各种锁

xiaoxiao2021-02-28  107

一、synchroinized 的功能扩展:重入锁

jdk6.0以后,重入锁和synchronized之间的性能差距已经不大了。

1、ReentrantLock的使用:

       lock.lock(); //加锁       ...        lock.unlock(); //释放锁

       优点:         a、有明显的操作工程,开发人员手动指定何时加锁,何时释放锁。灵活性好。

        b、一个线程可以连续多次获得同一把锁,即多次调用 lock()方法。

        c、可以中断处理: synchronized 要么得到锁继续执行,要么保持等待。

              ReentrantLock: synchronized的这两种状态外,还可以取消对锁的请求,即不再等待了。

         d、ReentrantLock.lockInterruptibly() 方法: 可以对中断进行响应的锁申请动作,即在等待锁的过程中              可以响应中断。

2、公平锁, new ReentrantLock(true), 根据系统的调度,一个线程会倾向于再次获得已经持有的锁。

这种方式是高效的,但毫无公平性可言。

3、重入锁的几个重要方法:

    a、lock(); 获得锁,如果锁已经被占用,则等待。

    b、unlock(); 释放锁

    c、tryLock(): 尝试获得锁,如果成功,则返回 true, 失败返回false。该方法不等待,立即返回。

     d、tryLock(long time, TimeUnit unit): 在给定的时间内尝试获得锁。

4、Condition 条件:

   a、await(): 使当前线程等待,同时释放当前锁,当其他线程中使用 signal()或signalAll()方法时,线程会重新获得锁并继续执行。或者当线程被中断时,也能跳出等待。与Object.wait()的方法很相似哪里不同?

  b、awaitUninterruptibly()方法与 await()方法基本相同,但是它并不会再等待过程中响应中断。

  c、singal()方法用于唤醒一个在等待中的线程。相对的singalAll()方法会唤醒所用在等待中的线程。

5、Semaphore 信号量:可以指定多个线程,同时访问某一个资源。

问题:

1、CAS操作?

2、阻塞原语:park(), unpark()。

转载请注明原文地址: https://www.6miu.com/read-23376.html

最新回复(0)