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();
}
}
}
}