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

并发笔记-----------使用显示的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并发实践-学习笔记

    10. **并发性能优化**:笔记会探讨如何通过优化并发策略来提高程序性能,例如减少锁的竞争、合理使用并发工具以及避免活锁和死锁。 11. **案例分析与实战**:笔记可能包含实际的并发编程案例,帮助读者更好地将理论...

    Java并发编程与高并发解决方案笔记-基础篇.docx

    - **非阻塞并发**:使用CAS(Compare and Swap)等无锁算法,减少线程间的竞争。 - **异步编程**:使用Future、CompletableFuture或回调函数,避免线程阻塞。 - **数据分片和分区**:将大对象或大数据分片,分散...

    Java并发编程与高并发解决方案-学习笔记

    ### Java并发编程与高并发解决方案知识点总结 #### 一、并发与高并发基本概念 ##### 1.1 并发 - **定义**: 指一个程序在同一时刻拥有两个或更多的线程,这些线程可以在单核或多核处理器上运行。 - **单核处理器上...

    java笔记-从浅入深的入门学习

    同时,学习Java的并发编程,包括线程、同步机制(synchronized关键字和Lock接口)以及并发集合(如ConcurrentHashMap),能帮助你编写出多线程环境下的高效程序。 最后,Java的异常处理、垃圾回收机制以及内存管理...

    良葛格 Java 学习笔记-JavaGossip全(v1+v2)

    6. **多线程**:讨论并发编程的基础,线程的创建与同步,包括synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口和ReentrantLock等高级并发工具。 7. **网络编程**:涵盖Socket编程,TCP和UDP的...

    笔记-4、显式锁和AQS1

    【笔记-4、显式锁和AQS1】 在Java并发编程中,显式锁(Lock)和隐式锁(synchronized)是两种常见的锁机制,它们提供了对共享资源的互斥访问。显式锁通过Java的Lock接口实现,而隐式锁主要依赖于synchronized关键字...

    数据库MYSQL底层原理分析-笔记-pdf

    - 锁(Lock)用于控制并发访问数据。MySQL中的锁包括共享锁(读锁)和排他锁(写锁),以及行级锁、表级锁、页级锁等不同粒度的锁。 4. **查询优化**: - 查询优化是提高数据库性能的关键,涉及索引使用、查询...

    Java并发编程与高并发解决方案-学习笔记.pdf

    内置锁使用synchronized关键字实现,而显示锁则是通过java.util.concurrent.locks.Lock接口实现。synchronized是基于JVM实现的,而Lock是基于API层面的。除了这两种基本的锁类型,Java还提供了诸如ReentrantLock、...

    嵌入式学习资料之Linux内核定时器笔记--千锋培训

    全局时钟中断处理程序确保所有核心上的时间同步,这通常涉及锁机制,如`xtime_lock`,以防止并发访问导致的时间不一致。 总的来说,了解这些定时器及其在Linux内核中的作用对于嵌入式开发人员至关重要,因为它们...

    java高并发笔记.docx

    【Java高并发笔记】 在Java开发中,处理高并发场景是一项关键技能,涉及到多个核心概念。以下是关于同步、异步、并发、并行、临界区、阻塞、非阻塞以及死锁、饥饿和活锁的详细解释。 1. **同步与异步** - **同步*...

    JAVA并发编程实践-线程安全-学习笔记

    另外,Java的并发包`java.util.concurrent`引入了显式锁(如`Lock`接口及其实现类),以及原语操作(如Atomic类),这些都为开发者提供了更细粒度的控制,可以在不使用synchronized的情况下实现线程安全。...

    原子指令于Lock-Free数据结构教学笔记

    ### 原子指令与Lock-Free数据结构 #### 原子指令概述 **原子指令**是一种特殊的硬件指令,能够以不可分割的方式对一个或多个内存位置执行操作。这意味着无论其他处理器正在执行何种指令,原子操作要么全部成功,...

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

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

    笔记-4、显式锁和AQS(1)1

    在同步状态的管理上,AQS通过`getState()`和`setState()`方法获取和设置同步状态,而`compareAndSetState()`方法则使用CAS(Compare And Swap)保证了状态更新的原子性,防止并发冲突。 此外,AQS还提供了一种条件...

    java并发编程笔记

    ### Java并发编程笔记 #### 一、线程与进程 - **进程**: 是操作系统资源分配的基本单位,每个进程都有自己的独立内存空间。例如,当我们打开QQ或者音乐播放器时,实际上是在启动`qq.exe`或`Music.exe`这样的程序,...

    笔记-3、原子操作CAS1

    在Java编程中,原子操作(Atomic Operation)是并发编程中的一种重要概念,它指的是在多线程环境下,某个操作能够不被其他线程中断,保证其完整性。这在并发编程中至关重要,因为线程间的相互干扰可能导致数据不一致...

    Java并发编程学习笔记

    此外,还可以使用BlockingQueue等高级并发工具进行线程间的数据传递。 以上就是Java并发编程中的关键知识点,掌握这些内容对于理解和编写高效的并发程序至关重要。理解并熟练运用这些工具和机制,可以有效地提升多...

    个人学习-JUC-笔记

    本笔记主要围绕尚硅谷周阳老师的JUC课程展开,旨在帮助个人学习者深入理解和掌握Java并发编程的核心知识。 1. **并发基础** - **线程与进程**:线程是程序执行的最小单位,进程则是资源分配的基本单位。了解它们的...

    java并发笔记,包含线程池

    Java并发笔记可能涵盖了以下几个核心知识点: 1. **线程与进程**:在操作系统中,进程是资源分配的基本单位,而线程是执行的基本单位。Java程序中的线程可以共享同一进程中的资源,创建和切换线程比创建和销毁进程...

Global site tag (gtag.js) - Google Analytics