当前位置: 移动技术网 > IT编程>开发语言>Java > Java多线程编程之Lock用法实例

Java多线程编程之Lock用法实例

2019年07月22日  | 移动技术网IT编程  | 我要评论

亚洲色B图色姐妹,cdlinux,男科医生在线咨询

锁是控制多个线程对共享资源进行访问的工具。通常,锁提供了对共享资源的独占访问。一次只能有一个线程获得锁,对共享资源的所有访问都需要首先获得锁。不过,某些锁可能允许对共享资源并发访问,如 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();
      }
    }
  }
}

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网