程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java多線程編程之Lock用法實例

Java多線程編程之Lock用法實例

編輯:關於JAVA

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved