`
ren2881971
  • 浏览: 108667 次
社区版块
存档分类
最新评论

并发笔记-----------使用显示的Lock对象

阅读更多
java机制中除了用synchronized关键字来做同步一外。
还可以用java.util.concurrent.lock包中的类
Lock lock=new ReentrantLock()来代替synchronized同步锁
区别是:
   使用synchronized 失败会抛出异常。
   而使用Lock后可以finally{}讲系统维护在正确的状态
Lock对象必须被显示的创建,锁定和释放。
虽然没有使用synchronized优雅代码少,不过一些特殊的情况 还是需要它的。附上一些例子代码:
package com.jit.test;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

public class AttemptLocking {

	private ReentrantLock lock = new ReentrantLock();

	public void untimed() {
		boolean captured = lock.tryLock();
		try {
			System.out.println("tryLock(): " + captured);
			System.out.flush();
		} finally {
			if (captured)
				lock.unlock();
		}
	}

	public void timed() {
		boolean captured = false;
		try {
			captured = lock.tryLock(2, TimeUnit.SECONDS);
		} catch (InterruptedException e) {
			throw new RuntimeException();
		}
		try {
			System.out.println("tryLock(2,TimeUnit.SECONDS): " + captured);
			System.out.flush();
		} finally {
			if (captured)
				lock.unlock();
		}
	}

	public static void main(String[] args) {
		final AttemptLocking al = new AttemptLocking();
		al.untimed();
		al.timed(); 
		new Thread() {
			{ 
				setDaemon(true);
			}
			public void run() {
				al.lock.lock();
				System.out.println("Acquired");
			}
		}.start();
		Thread.yield();
		al.untimed();
		al.timed();
	}
}

最后补充下:
synchronized比较死心眼,锁着的时候会一直等待该资源释放。
而ReentrantLock尝试获取但最终未获取锁,不会总等待。而是会决定离开去执行其他一些事情 。
分享到:
评论

相关推荐

    Java 并发学习笔记:进程和线程,并发理论,并发关键字,Lock 体系,原子操作类,发容器 & 并发工具,线程池,并发实践

    Java 并发学习笔记: 进程和线程, 并发理论, 并发关键字, Lock 体系, 原子操作类, 发容器 & 并发工具, 线程池, 并发实践 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的...

    notes-learning-java-concurrency:java 并发学习笔记

    Java并发编程学习笔记 这是我两年前(2012-05)的学习笔记。。 -- 本文不会详细介绍java5以前的多线程开发...协调共享对象访问,在java5以前用synchronized实现,现在可以用Lock显式的lock()和unlock(),并且有定时锁,读写

    JAVA高并发_学习笔记

    JAVA学习高并发的学习笔记。同步非阻塞式IO:Buffere Channel Selector Concurrent包:Blocking:Queue\Concurrent Hash Map \ExcutorService\lock\原子性 BlockingQueue:ArrayBlockingQueue , DelayQueue , ...

    Java并发编程的艺术.md

    《Java并发编程的艺术》笔记 第一章 并发编程的挑战 第二章 Java并发机制的底层实现原理 volatile的两条实现原则: 1. Lock前缀指令会引起处理器缓存回写到内存 2. 一个处理器的缓存回写到内存会导致其他...

    c#学习笔记.txt

    使用 new 运算符创建结构对象时,将创建该结构对象,并且调用适当的构造函数。与类不同的是,结构的实例化可以不使用 new 运算符。如果不使用 new,那么在初始化所有字段之前,字段将保持未赋值状态且对象不可用。...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 第一章 Oracle入门 一、 数据库概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。简单来说是本身可视...

    JUC多线程学习个人笔记

    JUC(Java Util Concurrent)是Java中用于并发编程的工具包,提供了一组接口和类,用于处理多线程和并发操作。JUC提供了一些常用的并发编程模式和工具,如线程池、并发集合、原子操作等。 JUC的主要特点包括: ...

    net学习笔记及其他代码应用

    lock(this) { if (i>10) { i--; test(i); } } } 答:不会发生死锁,(但有一点int是按值传递的,所以每次改变的都只是一个副本,因此不会出现死锁。但如果把int换做一个object,那么死锁会发生) 30.简要...

    java8源码-JavaSE-Code:JavaSE的代码练习与学习笔记总结

    java8 源码 Java SE 的代码与笔记 [ReadMe部分没有代码,代码都在项目文件中] ...哪个线程先执行带有synchronized关键字的方法,哪个对象就拥有该方法所属对象的锁Lock 当A线程调用anyObject对象加入syn

    leetcode下载-study:学习笔记

    Lock 与 Sychronized 区别 Redis 分布式锁 Zookeeper 分布式锁 死锁产生原因 如何解决死锁 数据库死锁例子 JAVA 并发 AQS 源码 ReentrantLock 源码 Condition 源码 ConcurrentHashMap 源码 Java 线程状态 JAVA 数据...

    redisson分布式锁源码笔记

    3、RLock#lock()方法源码解析 4、看门狗的作用及实现 5、lua脚本加锁逻辑 6、watchdog维持加锁 7、重入锁在lua脚本中的提现 8、latch.countDown()方法源码解析 9、写锁释放逻辑 10、不同客户端不同线程的互斥原则 11...

    java8集合源码分析-common-mistakes:常见错误

    使用了并发工具类库,线程安全就高枕无忧了吗?:concurrenttool 代码加锁:不要让“锁”事成为烦心事:lock 线程池:业务代码最常用也最容易犯错的组件:threadpool HTTP调用:你考虑到超时、重试、并发了吗?:...

    jedis使用指南

    Jedis使用总结 前段时间细节的了解了Jedis的使用,Jedis是redis的java版本的客户端实现。 本文做个总结,主要分享如下内容: 【pipeline】【分布式的id生成器】【分布式锁【watch】【multi】】【redis分布式】 好了...

    成都四方伟业JAVA笔试题-notebook:你好2019

    7.开发分业务性和非业务性,非业务性中经常碰到容量,并发,安全,性能等等,你是怎么解决的。 8.说一下学习JVM后对自己写代码上有什么提高和帮助。 9.说一个你认为你因为钻研技术而成功解决的棘手问题。 10.你期望...

    java线程池概念.txt

    当然,现在用过的东西并不是代表以后还能娴熟的使用,做好笔记非常重要; 1:必须明白为什么要使用线程池:(这点很重要)  a:手上项目所需,因为项目主要的目的是实现多线程的数据推送;需要创建多线程的话,那...

Global site tag (gtag.js) - Google Analytics