ReentrantLock有个有参数构造函数

非公平锁

ReentrantLock(false) 就是 多个线程抢资源的时候,会出现可能都是A线程干活 B线程都不怎么抢的到活,优点是效率高,缺点是某个线程可能不干活。

公平锁

ReentrantLock(true) 缺点是效率低,优点是每个线程都能有活干

可重入锁(递归锁)

所谓可重入锁就是,进入锁之后,还可以畅通无阻的再次进入同一把锁。

  1. package com.daijunyi.lock;
  2. public class ReInLock {
  3. public static void main(String[] args) {
  4. Object o = new Object();
  5. new Thread(()->{
  6. synchronized(o){
  7. System.out.println("外部");
  8. synchronized(o){
  9. System.out.println("内部");
  10. }
  11. }
  12. },"AA").start();
  13. }
  14. }

死锁

两个或两个以上线程执行过程中,因为争夺资源而造成一种互相等待的现象,如果没有外力干涉,他们无法再执行下去
产生死锁的原因:

  1. 系统资源不足
  2. 进程运行推进顺序不合适
  3. 资源分配不当 ```java package com.daijunyi.sync;

import java.util.concurrent.TimeUnit;

public class DeadLock {

public static void main(String[] args) {
    Object a = new Object();
    Object b = new Object();
    new Thread(new Runnable() {
        @Override
        public void run() {
            synchronized (a){
                System.out.println("获取了锁A,试图获取锁b");
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (b){
                    System.out.println("获取锁b");
                }
            }
        }
    },"aa").start();

    new Thread(new Runnable() {
        @Override
        public void run() {
            synchronized (b){
                System.out.println("获取锁b,正视图获取锁a");
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (a) {
                    System.out.println("获取锁a");
                }
            }
        }
    },"bb").start();
}

}

如何查看死锁<br />使用java命令
```shell
jps -l

可以查看相关线程信息

55744 sun.tools.jps.Jps
55730 com.daijunyi.sync.DeadLock
27236 myssh.App
55641 
55292 
55391 org.jetbrains.idea.maven.server.RemoteMavenServer36
55727 org.jetbrains.jps.cmdline.Launcher

接着使用命令

jstack 进程号 55730

查看出信息

2021-07-16 23:08:47
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.111-b14 mixed mode):

"Attach Listener" #13 daemon prio=9 os_prio=31 tid=0x00007ff5a2054000 nid=0x5803 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"DestroyJavaVM" #12 prio=5 os_prio=31 tid=0x00007ff5a2863800 nid=0xf03 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"bb" #11 prio=5 os_prio=31 tid=0x00007ff5a180a800 nid=0x5603 waiting for monitor entry [0x000070000f225000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at com.daijunyi.sync.DeadLock$2.run(DeadLock.java:40)
        - waiting to lock <0x000000076aba2568> (a java.lang.Object)
        - locked <0x000000076aba2578> (a java.lang.Object)
        at java.lang.Thread.run(Thread.java:745)

"aa" #10 prio=5 os_prio=31 tid=0x00007ff5a2862800 nid=0x5503 waiting for monitor entry [0x000070000f122000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at com.daijunyi.sync.DeadLock$1.run(DeadLock.java:23)
        - waiting to lock <0x000000076aba2578> (a java.lang.Object)
        - locked <0x000000076aba2568> (a java.lang.Object)
        at java.lang.Thread.run(Thread.java:745)

"Service Thread" #9 daemon prio=9 os_prio=31 tid=0x00007ff5a181a800 nid=0x3b03 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C1 CompilerThread3" #8 daemon prio=9 os_prio=31 tid=0x00007ff5a181a000 nid=0x3d03 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread2" #7 daemon prio=9 os_prio=31 tid=0x00007ff5a1819000 nid=0x3f03 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" #6 daemon prio=9 os_prio=31 tid=0x00007ff5a1818800 nid=0x4103 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" #5 daemon prio=9 os_prio=31 tid=0x00007ff5a4827000 nid=0x3603 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" #4 daemon prio=9 os_prio=31 tid=0x00007ff5a1014800 nid=0x3403 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" #3 daemon prio=8 os_prio=31 tid=0x00007ff5a202d800 nid=0x4a03 in Object.wait() [0x000070000e804000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x000000076ab08e98> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
        - locked <0x000000076ab08e98> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)

"Reference Handler" #2 daemon prio=10 os_prio=31 tid=0x00007ff5a4023000 nid=0x4c03 in Object.wait() [0x000070000e701000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x000000076ab06b40> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:502)
        at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
        - locked <0x000000076ab06b40> (a java.lang.ref.Reference$Lock)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)

"VM Thread" os_prio=31 tid=0x00007ff5a481a800 nid=0x4e03 runnable 

"GC task thread#0 (ParallelGC)" os_prio=31 tid=0x00007ff5a200a800 nid=0x2107 runnable 

"GC task thread#1 (ParallelGC)" os_prio=31 tid=0x00007ff5a200e000 nid=0x1d03 runnable 

"GC task thread#2 (ParallelGC)" os_prio=31 tid=0x00007ff5a200e800 nid=0x1f03 runnable 

"GC task thread#3 (ParallelGC)" os_prio=31 tid=0x00007ff5a5008800 nid=0x2a03 runnable 

"GC task thread#4 (ParallelGC)" os_prio=31 tid=0x00007ff5a200f000 nid=0x5303 runnable 

"GC task thread#5 (ParallelGC)" os_prio=31 tid=0x00007ff5a2010000 nid=0x5203 runnable 

"GC task thread#6 (ParallelGC)" os_prio=31 tid=0x00007ff5a2010800 nid=0x2c03 runnable 

"GC task thread#7 (ParallelGC)" os_prio=31 tid=0x00007ff5a2011000 nid=0x4f03 runnable 

"VM Periodic Task Thread" os_prio=31 tid=0x00007ff5a2031800 nid=0x3803 waiting on condition 

JNI global references: 6


Found one Java-level deadlock:
=============================
"bb":
  waiting to lock monitor 0x00007ff5a202a4b8 (object 0x000000076aba2568, a java.lang.Object),
  which is held by "aa"
"aa":
  waiting to lock monitor 0x00007ff5a202cdf8 (object 0x000000076aba2578, a java.lang.Object),
  which is held by "bb"

Java stack information for the threads listed above:
===================================================
"bb":
        at com.daijunyi.sync.DeadLock$2.run(DeadLock.java:40)
        - waiting to lock <0x000000076aba2568> (a java.lang.Object)
        - locked <0x000000076aba2578> (a java.lang.Object)
        at java.lang.Thread.run(Thread.java:745)
"aa":
        at com.daijunyi.sync.DeadLock$1.run(DeadLock.java:23)
        - waiting to lock <0x000000076aba2578> (a java.lang.Object)
        - locked <0x000000076aba2568> (a java.lang.Object)
        at java.lang.Thread.run(Thread.java:745)

Found 1 deadlock.