非公平锁
ReentrantLock(false) 就是 多个线程抢资源的时候,会出现可能都是A线程干活 B线程都不怎么抢的到活,优点是效率高,缺点是某个线程可能不干活。
公平锁
ReentrantLock(true) 缺点是效率低,优点是每个线程都能有活干
可重入锁(递归锁)
所谓可重入锁就是,进入锁之后,还可以畅通无阻的再次进入同一把锁。
package com.daijunyi.lock;
public class ReInLock {
public static void main(String[] args) {
Object o = new Object();
new Thread(()->{
synchronized(o){
System.out.println("外部");
synchronized(o){
System.out.println("内部");
}
}
},"AA").start();
}
}
死锁
两个或两个以上线程执行过程中,因为争夺资源而造成一种互相等待的现象,如果没有外力干涉,他们无法再执行下去
产生死锁的原因:
- 系统资源不足
- 进程运行推进顺序不合适
- 资源分配不当 ```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.