15個頂級多線程面試題及答案


https://www.cnblogs.com/starcrm/p/5010336.html定時線程池中scheduleWithFixedDelay和scheduleAtFixedRate

 

轉自https://www.cnblogs.com/huajiezh/p/5790942.html 

1)現在有T1、T2、T3三個線程,你怎樣保證T2在T1執行完后執行,T3在T2執行完后執行?

這個線程問題通常會在第一輪或電話面試階段被問到,目的是檢測你對”join”方法是否熟悉。這個多線程問題比較簡單,可以用join方法實現。

不錯的鏈接講解  鏈接x=https://blog.csdn.net/u010983881/article/details/80257703

有趣的是,第一個運行結果大概率是這樣的。說明沒主線程會搶嗎,。,

第二個運行結果是這樣的

 

 

猜想是這樣的:指令做了重新排序,或者看看源碼去,現在能力弱雞,還是先別看。以上兩張圖說明會把主線程先運行完再去運行子線程的東西。從下面的運行看,是和主線程搶的太少了,線程多的時候,嘿嘿主線程就多掛會把。

而join會把當前正在被調用的線程阻塞直到調用的線程運行完畢。當設置了join(time)時間的時候,time過了,不管threadA有沒有執行完都會回到主線程.如下,上面join(500)的結果

所以T1-->T2-->T3,  

 

 

 

 

 

 

 

 

右圖是代碼,開始是無序執行的,解開注釋代碼后,就是有序的了。join拿到主線程,讓自己先運行完,然后回到主線程。  

 外記,創建線程用的是鏈接中顯示創建,阿里給的提示 

 

2 在Java中Lock接口比synchronized塊的優勢是什么?你需要實現一個高效的緩存,它允許多個用戶讀,但只允許一個用戶寫,以此來保持它的完整性,你會怎樣去實現它?

lock鎖參考1     https://www.cnblogs.com/dolphin0520/p/3923167.html  

多個用戶讀,一個用戶寫:   https://www.cnblogs.com/XinHuai/p/6830790.html

外記  synchronized和ReentrantLock都是可重入鎖

總結來說,Lock和synchronized有以下幾點不同:

  1)Lock是一個接口,而synchronized是Java中的關鍵字,synchronized是內置的語言實現;

  2)synchronized在發生異常時,會自動釋放線程占有的鎖,因此不會導致死鎖現象發生;而Lock在發生異常時,如果沒有主動通過unLock()去釋放鎖,則很可能造成死鎖現象,因此使用Lock時需要在finally塊中釋放鎖;

  3)Lock可以讓等待鎖的線程響應中斷,而synchronized卻不行,使用synchronized時,等待的線程會一直等待下去,不能夠響應中斷;      lock的優勢1

  4)通過Lock可以知道有沒有成功獲取鎖,而synchronized卻無法辦到。   優勢2

  5)Lock可以提高多個線程進行讀操作的效率。  優勢3

  在性能上來說,如果競爭資源不激烈,兩者的性能是差不多的,而當競爭資源非常激烈時(即有大量線程同時競爭),此時Lock的性能要遠遠優於synchronized。所以說,在具體使用時要根據適當情況選擇。

3)在java中wait和sleep方法的不同?

最大的不同是在等待時wait會釋放鎖,而sleep一直持有鎖。Wait通常被用於線程間交互,sleep通常被用於暫停執行。

4)用Java實現阻塞隊列

https://www.cnblogs.com/huojg-21442/p/7119727.html     阻塞隊列實現1

https://www.cnblogs.com/dolphin0520/p/3932906.html   心情不爽,沒看了

5)用Java寫代碼來解決生產者——消費者問題。

http://www.cnblogs.com/moongeek/p/7631447.html

https://www.cnblogs.com/jiangyang/p/6007030.html

1 wait/notify

 1 package one.threadLearn.productAndCustomer.one;
 2 
 3 public class Hosee {
 4     private static Integer count = 0;
 5     private final Integer  FULL  = 10;
 6     private static String  LOCK  = "LOCK";
 7 
 8     class Producer implements Runnable {
 9         @Override
10         public void run() {
11             for (int i = 0; i < 10; i++) {
12                 try {
13                     Thread.sleep(3000);
14                 } catch (Exception e) {
15                     e.printStackTrace();
16                 }
17                 synchronized (LOCK) {
18                     while (count == FULL) {
19                         try {
20                             System.out.println("倉庫滿了");
21                             LOCK.wait();
22                         } catch (Exception e) {
23                             e.printStackTrace();
24                         }
25                     }
26                     count++;
27                     System.out.println(Thread.currentThread().getName() + "生產者生產,目前總共有" + count);
28                     LOCK.notifyAll();
29                 }
30             }
31         }
32     }
33 
34     class Consumer implements Runnable {
35         @Override
36         public void run() {
37             for (int i = 0; i < 10; i++) {
38                 try {
39                     Thread.sleep(3000);
40                 } catch (InterruptedException e1) {
41                     e1.printStackTrace();
42                 }
43                 synchronized (LOCK) {
44                     while (count == 0) {
45                         try {
46                             System.out.println("庫存空了");
47                             LOCK.wait();
48                         } catch (Exception e) {
49                         }
50                     }
51                     count--;
52                     System.out.println(Thread.currentThread().getName() + "消費者消費,目前總共有" + count);
53                     LOCK.notifyAll();
54                 }
55             }
56         }
57     }
58 
59     public static void main(String[] args) throws Exception {
60         Hosee hosee = new Hosee();
61         new Thread(hosee.new Producer()).start();
62         new Thread(hosee.new Producer()).start();
63         new Thread(hosee.new Consumer()).start();
64         new Thread(hosee.new Producer()).start();
65         new Thread(hosee.new Consumer()).start();
66         new Thread(hosee.new Producer()).start();
67         new Thread(hosee.new Consumer()).start();
68         new Thread(hosee.new Producer()).start();
69         new Thread(hosee.new Consumer()).start();
70     }
71 }
View Code

6)用Java編程一個會導致死鎖的程序,你將怎么解決?

 

7) 什么是原子操作,Java中的原子操作是什么?

 

8) Java中的volatile關鍵是什么作用?怎樣使用它?在Java中它跟synchronized方法有什么不同?

 

 

9) 什么是競爭條件?你怎樣發現和解決競爭?

 

 

10) 你將如何使用thread dump?你將如何分析Thread dump?

 

11) 為什么我們調用start()方法時會執行run()方法,為什么我們不能直接調用run()方法?

 

12) Java中你怎樣喚醒一個阻塞的線程?

 

 

13)在Java中CycliBarriar和CountdownLatch有什么區別?

 

14) 什么是不可變對象,它對寫並發應用有什么幫助?

 

 

15) 你在多線程環境中遇到的共同的問題是什么?你是怎么解決它的?

 

 

 

 

https://www.javazhiyin.com/category/thread


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM