Java虛擬機將線程獨占分配為一種可選的實現方法。這種分配方式可以保證某些操作僅由一個線程執行,例如加鎖操作。由于線程獨占可以極大的減少多線程操作的鎖競爭,因此是高并發場景下非常重要的優化手段之一。
public class Lock { private boolean locked = false; public synchronized void lock() throws InterruptedException { while(locked) { wait(); } locked = true; } public synchronized void unlock() { locked = false; notifyAll(); } }
此處的鎖實現使用synchronized關鍵字進行同步,線程獨占確保只有一個線程可以進入synchronized塊,避免了多線程之間的競爭。但是,線程獨占也存在一些缺點,當需要執行I/O等耗時操作時,線程被I/O操作占用后,其他線程就無法執行,導致線程資源浪費。
線程共享則是另一種線程分配實現方式,多個線程可以共享同一個線程,將線程分配給細粒度、單獨的任務而不是整個應用程序。當某個任務占據線程并執行阻塞操作時,其他任務可以使用該線程執行其工作,從而提高系統資源利用率。
public class Executor { private final BlockingQueuetasks = new LinkedBlockingQueue<>(); public Executor(int threadCount) { for(int i=0; i { while(true) { try { Runnable task = tasks.take(); task.run(); } catch(InterruptedException e) { Thread.currentThread.interrupt(); break; } } }).start(); } } public void submit(Runnable task) { tasks.offer(task); } }
此處的Executor通過線程池實現多任務共享線程。使用BlockingQueue實現任務的異步提交,一旦有空閑線程,便將任務分配給該線程執行。當所有線程都處于繁忙狀態時,新任務被放入任務隊列等待,避免了線程占用過多的情況,提高了系統效率。