java5 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();
}
}
}
}
java5 Lock用法的更多相关文章
- c#初学-多线程中lock用法的经典实例
		本文转载自:http://www.cnblogs.com/promise-7/articles/2354077.html 一.Lock定义 lock 关键字可以用来确保代码块完成运行,而不会被 ... 
- 多线程中lock用法的经典实例
		多线程中lock用法的经典实例 一.Lock定义 lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.它可以把一段代码定义为互斥段(critical section),互斥段在一 ... 
- 一个线程中lock用法的经典实例
		/* 该实例是一个线程中lock用法的经典实例,使得到的balance不会为负数 同时初始化十个线程,启动十个,但由于加锁,能够启动调用WithDraw方法的可能只能是其中几个 作者:http://h ... 
- java5 Condition用法--实现线程间的通信
		Condition的功能类似在传统线程技术中的Object.wait()和Object.natify()的功能,传统线程技术实现的互斥只能一个线程单独干,不能说这个线程干完了通知另一个线程来干,Con ... 
- 单例模式 与lock用法
		在之前没用lock之前:如果我实现单例模式:直接就是下面的代码: public class Singleton { private static Singleton instanc ... 
- synchronized Lock用法
		在介绍Lock与synchronized时,先介绍下Lock: public interface Lock { void lock(); void lockInterruptibly() throws ... 
- java5 ReadWriteLock用法--读写锁实现
		读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可.如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁:如果你的代码修改数据,只能有一 ... 
- C# lock用法
		当我们使用线程的时候,效率最高的方式当然是异步,即各个线程同时运行,其间不相互依赖和等待.但当不同的线程都需要访问某个资源的时候,就需要同步机制了,也就是说当对同一个资源进行读写的时候,我们要使该资源 ... 
- 多线程的并发问题,lock用法
		开启多个线程,每个线程中多次操作公共变量 using System; using System.Collections.Generic; using System.Linq; using System ... 
随机推荐
- Win7 64位系统 VS2010连接Oracle报错的问题
			1,异常现象: TNS无法识别 2,异常分析:VS2010启动调试的时候,出现异常.但是使用IIS作为服务器的时候,是不会出现异常,也就是可以正常访问到数据库,后来分析是由于VS自带服务器ASP.NE ... 
- buildroot 使用小记 - 2   源文件目录结构
			官方下载下来的buildroot源码包在解压后,是一个名为buildroot的文件夹,它下面的目录/文件结构如下: Makefile - 顶级makefile,编译总入口 Config.in - 顶级 ... 
- ide编辑器
			http://wowubuntu.com/markdown/#editor https://netbeans.org/downloads/start.html?platform=windows& ... 
- Node中的http模块
			通过Node模块,我们可以实现客户端和服务器端.这篇文章主要研究如何利用http和一些相关模块构建客户端和服务器端代码.读完本文,将能够实现client向server发送数据,而server将数据原样 ... 
- eclipse构建及运行maven web项目
			1:环境 eclipse indigo, JDK1.6, maven 3.2.1, tomcat7.0.42 2:安装eclipse maven插件 m2eclipse 第一种方法:从网上下载m2ec ... 
- Selenium2+python自动化20-Excel数据参数化
			前言 问: Python 获取到Excel一列值后怎么用selenium录制的脚本中参数化,比如对登录用户名和密码如何做参数化? 答:可以使用xlrd读取Excel的内容进行参数化.当然为了便于各位小 ... 
- windbg符号
			Symbol Server (Microsoft): srv*c:\mss*http://msdl.microsoft.com/download/symbols Symbol Server (Citr ... 
- Pojo类(plain ordinary java object)
			POJO有一些private的参数作为对象的属性.然后针对每个参数定义了get和set方法作为访问的接口.例如:public class User {private long id;private S ... 
- EF 6 for mysql
			1. NuGet安装 MySql.Data.MySql.Data.Entity 2.安装Entity Framework 6 Tools for Visual Studio 2012 & 20 ... 
- PHP中的 extends与implements 区别 [转]
			extends 是继承某个类 继承之后可以使用父类的方法 也可以重写父类的方法 implements 是实现多个接口 接口的方法一般为空的 必须重写才能使用 extends是继承父类,只要那个类不是声 ... 
