Java多線程編程之Lock用法實例。本站提示廣大學習愛好者:(Java多線程編程之Lock用法實例)文章只能為提供參考,不一定能成為您想要的結果。以下是Java多線程編程之Lock用法實例正文
鎖是掌握多個線程對同享資本停止拜訪的對象。平日,鎖供給了對同享資本的獨有拜訪。一次只能有一個線程取得鎖,對同享資本的一切拜訪都須要起首取得鎖。不外,某些鎖能夠許可對同享資本並發拜訪,如 ReadWriteLock(保護了一對相干的鎖,一個用於只讀操作,另外一個用於寫入操作) 的讀寫鎖。
1、Lock供給了無前提的、可輪詢的、准時的、可中止的鎖獲得操作,一切加鎖息爭鎖的辦法都是顯式的。
public interface Lock{ void lock(); //加鎖 //優先斟酌呼應中止,而不是呼應鎖定的通俗獲得或重入獲得 void lockInterruptibly() throws InterruptedException; boolean tryLock(); //可准時和可輪詢的鎖獲得形式 boolean tryLock(long timeout,TimeUnit unit) throws InterruptedException; void unlock(); //解鎖 Condition newCondition(); }
2、ReentrantLock完成了lock接口,跟synchronized比擬,ReentrantLock為處置弗成用的鎖供給了更多靈巧性。
3、應用lock接口的標准情勢請求在finally塊中釋放鎖lock.unlock()。假如鎖守護的代碼在try塊以外拋出了異常,它將永久不會被釋放。
以下模仿Lock用法:假定有兩個線程(A線程、B線程)去挪用print(String name)辦法,A線程擔任打印'zhangsan'字符串,B線程擔任打印'lisi'字符串。
1、當沒無為print(String name)辦法加上鎖時,則會發生A線程還沒有履行終了,B線程已開端履行,那末打印出來的name就會湧現以下成績。
2、當為print(String name)辦法加上鎖時,則會發生A履行終了後,B線程才履行print(String name)辦法,到達互斥或許說同步後果。
package com.ljq.test.thread; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 用Lock替換synchronized * * @author Administrator * */ public class LockTest { public static void main(String[] args) { new LockTest().init(); } private void init() { final Outputer outputer = new Outputer(); //A線程 new Thread(new Runnable() { @Override public void run() { while (true) { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } outputer.output("zhangsan"); } } }).start(); //B線程 new Thread(new Runnable() { @Override public void run() { while (true) { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } outputer.output("lisi"); } } }).start(); } static class Outputer { Lock lock = new ReentrantLock(); /** * 打印字符 * * @param name */ public void output(String name) { int len = name.length(); lock.lock(); try { for (int i = 0; i < len; i++) { System.out.print(name.charAt(i)); } System.out.println(); } finally { lock.unlock(); } } } }