Java多线程编程之Lock用法实例
程序员文章站
2024-03-03 16:49:34
锁是控制多个线程对共享资源进行访问的工具。通常,锁提供了对共享资源的独占访问。一次只能有一个线程获得锁,对共享资源的所有访问都需要首先获得锁。不过,某些锁可能允许对共享资源...
锁是控制多个线程对共享资源进行访问的工具。通常,锁提供了对共享资源的独占访问。一次只能有一个线程获得锁,对共享资源的所有访问都需要首先获得锁。不过,某些锁可能允许对共享资源并发访问,如 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(); } } } }
上一篇: 详解Struts2动态方法调用