From 464f3280ac10eecb13cfa1121d31ca77c5095c9e Mon Sep 17 00:00:00 2001
From: lvhonghong <1102600675@qq.com>
Date: Mon, 10 Jan 2022 01:04:52 +0800
Subject: [PATCH] add must lock demo
---
java-thread.iml | 2 -
.../liaoxuefeng/thread16_Future/Main.java | 46 +++++++--------
.../thread7_deadLock/DeadLockDemo.java | 15 +++++
.../thread7_deadLock/DeadLockTask.java | 56 +++++++++++++++++++
4 files changed, 94 insertions(+), 25 deletions(-)
delete mode 100644 java-thread.iml
create mode 100644 src/main/java/com/xufx/thread/liaoxuefeng/thread7_deadLock/DeadLockDemo.java
create mode 100644 src/main/java/com/xufx/thread/liaoxuefeng/thread7_deadLock/DeadLockTask.java
diff --git a/java-thread.iml b/java-thread.iml
deleted file mode 100644
index 78b2cc5..0000000
--- a/java-thread.iml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
\ No newline at end of file
diff --git a/src/main/java/com/xufx/thread/liaoxuefeng/thread16_Future/Main.java b/src/main/java/com/xufx/thread/liaoxuefeng/thread16_Future/Main.java
index 663c220..48d0723 100644
--- a/src/main/java/com/xufx/thread/liaoxuefeng/thread16_Future/Main.java
+++ b/src/main/java/com/xufx/thread/liaoxuefeng/thread16_Future/Main.java
@@ -1,23 +1,23 @@
-package com.xufx.thread.liaoxuefeng.thread16_Future;
-
-import java.util.concurrent.*;
-
-/**
- * Created by xufx on 2022/1/5 22:30
- * 执行多个任务的时候,使用线程池是很方便的,只要实现Runnable接口就行,但是Runnable接口有个问题,就是没有返回值。
- * 如果需要返回值,可以使用Java提供的Callable接口。Callable接口支持泛型,可以返回指定的结果
- * ExecutorService.submit()方法的返回值是Future。
- * Future的实例代表一个未来能获取结果的对象
- * Future获取异步执行结果时候,要么调用阻塞方法get(),要么轮询看isDone()是否返回true,弊端是主线程都要跟着等待了。
- */
-public class Main {
- public static void main(String[] args) throws ExecutionException, InterruptedException {
- ExecutorService executor = Executors.newFixedThreadPool(4);
- //定义任务
- Callable task = ()-> "hhhhh";
- Future future = executor.submit(task);
- //可能会导致阻塞(如果异步任务没有完成就会导致阻塞)
- String s = future.get();
- System.out.println(s);
- }
-}
+package com.xufx.thread.liaoxuefeng.thread16_Future;
+
+import java.util.concurrent.*;
+
+/**
+ * Created by xufx on 2022/1/5 22:30
+ * 执行多个任务的时候,使用线程池是很方便的,只要实现Runnable接口就行,但是Runnable接口有个问题,就是没有返回值。
+ * 如果需要返回值,可以使用Java提供的Callable接口。Callable接口支持泛型,可以返回指定的结果
+ * ExecutorService.submit()方法的返回值是Future。
+ * Future的实例代表一个未来能获取结果的对象
+ * Future获取异步执行结果时候,要么调用阻塞方法get(),要么轮询看isDone()是否返回true,弊端是主线程都要跟着等待了。
+ */
+public class Main {
+ public static void main(String[] args) throws ExecutionException, InterruptedException {
+ ExecutorService executor = Executors.newFixedThreadPool(4);
+ //定义任务
+ Callable task = ()-> "hhhhh";
+ Future future = executor.submit(task);
+ //可能会导致阻塞(如果异步任务没有完成就会导致阻塞)
+ String s = future.get();
+ System.out.println(s);
+ }
+}
diff --git a/src/main/java/com/xufx/thread/liaoxuefeng/thread7_deadLock/DeadLockDemo.java b/src/main/java/com/xufx/thread/liaoxuefeng/thread7_deadLock/DeadLockDemo.java
new file mode 100644
index 0000000..67a2205
--- /dev/null
+++ b/src/main/java/com/xufx/thread/liaoxuefeng/thread7_deadLock/DeadLockDemo.java
@@ -0,0 +1,15 @@
+package com.xufx.thread.liaoxuefeng.thread7_deadLock;
+
+public class DeadLockDemo {
+
+ public static void main(String[] args) {
+ Object object1 = new Object();
+ Object object2 = new Object();
+ Thread t1 = new Thread(new DeadLockTask(object1, object2, false), "thread-1");
+ Thread t2 = new Thread(new DeadLockTask(object1, object2, true), "thread-2");
+
+ t1.start();
+ t2.start();
+ }
+
+}
diff --git a/src/main/java/com/xufx/thread/liaoxuefeng/thread7_deadLock/DeadLockTask.java b/src/main/java/com/xufx/thread/liaoxuefeng/thread7_deadLock/DeadLockTask.java
new file mode 100644
index 0000000..80a8dcf
--- /dev/null
+++ b/src/main/java/com/xufx/thread/liaoxuefeng/thread7_deadLock/DeadLockTask.java
@@ -0,0 +1,56 @@
+package com.xufx.thread.liaoxuefeng.thread7_deadLock;
+
+public class DeadLockTask implements Runnable {
+ private Object lock1;
+ private Object lock2;
+ private Boolean flag;
+
+
+ public DeadLockTask(Object o1, Object o2, Boolean flag) {
+ this.lock1 = o1;
+ this.lock2 = o2;
+ this.flag = flag;
+ }
+
+ @Override
+ public void run() {
+
+ synchronized (lock1) {
+ if (flag) {
+ System.out.println(Thread.currentThread().getName() + "---- Xixi:holding orange...");
+
+ try {
+ Thread.sleep(3000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+
+ System.out.println(Thread.currentThread().getName() + "---- Xixi: waiting for lock of Hoho");
+ synchronized (lock2) {
+ System.out.println(Thread.currentThread().getName() + "---- Xixi: got Hoho's lock: apple");
+ }
+ }
+ }
+
+ if (!flag) {
+ System.out.println(Thread.currentThread().getName() + "---- Hoho:holding apple...");
+
+ synchronized (lock2) {
+
+ try {
+ Thread.sleep(3000);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ System.out.println(Thread.currentThread().getName() + "---- Hoho: waiting for lock of Xixi");
+ synchronized (lock1) {
+ System.out.println(Thread.currentThread().getName() + "---- Hoho: got Xixi's lock: orange");
+ }
+ }
+
+ }
+
+ }
+}
--
Gitee