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尝试获取但最终未获取锁,不会总等待。而是会决定离开去执行其他一些事情 。
分享到:
相关推荐
10. **并发性能优化**:笔记会探讨如何通过优化并发策略来提高程序性能,例如减少锁的竞争、合理使用并发工具以及避免活锁和死锁。 11. **案例分析与实战**:笔记可能包含实际的并发编程案例,帮助读者更好地将理论...
- **非阻塞并发**:使用CAS(Compare and Swap)等无锁算法,减少线程间的竞争。 - **异步编程**:使用Future、CompletableFuture或回调函数,避免线程阻塞。 - **数据分片和分区**:将大对象或大数据分片,分散...
### Java并发编程与高并发解决方案知识点总结 #### 一、并发与高并发基本概念 ##### 1.1 并发 - **定义**: 指一个程序在同一时刻拥有两个或更多的线程,这些线程可以在单核或多核处理器上运行。 - **单核处理器上...
同时,学习Java的并发编程,包括线程、同步机制(synchronized关键字和Lock接口)以及并发集合(如ConcurrentHashMap),能帮助你编写出多线程环境下的高效程序。 最后,Java的异常处理、垃圾回收机制以及内存管理...
6. **多线程**:讨论并发编程的基础,线程的创建与同步,包括synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口和ReentrantLock等高级并发工具。 7. **网络编程**:涵盖Socket编程,TCP和UDP的...
【笔记-4、显式锁和AQS1】 在Java并发编程中,显式锁(Lock)和隐式锁(synchronized)是两种常见的锁机制,它们提供了对共享资源的互斥访问。显式锁通过Java的Lock接口实现,而隐式锁主要依赖于synchronized关键字...
- 锁(Lock)用于控制并发访问数据。MySQL中的锁包括共享锁(读锁)和排他锁(写锁),以及行级锁、表级锁、页级锁等不同粒度的锁。 4. **查询优化**: - 查询优化是提高数据库性能的关键,涉及索引使用、查询...
内置锁使用synchronized关键字实现,而显示锁则是通过java.util.concurrent.locks.Lock接口实现。synchronized是基于JVM实现的,而Lock是基于API层面的。除了这两种基本的锁类型,Java还提供了诸如ReentrantLock、...
全局时钟中断处理程序确保所有核心上的时间同步,这通常涉及锁机制,如`xtime_lock`,以防止并发访问导致的时间不一致。 总的来说,了解这些定时器及其在Linux内核中的作用对于嵌入式开发人员至关重要,因为它们...
【Java高并发笔记】 在Java开发中,处理高并发场景是一项关键技能,涉及到多个核心概念。以下是关于同步、异步、并发、并行、临界区、阻塞、非阻塞以及死锁、饥饿和活锁的详细解释。 1. **同步与异步** - **同步*...
另外,Java的并发包`java.util.concurrent`引入了显式锁(如`Lock`接口及其实现类),以及原语操作(如Atomic类),这些都为开发者提供了更细粒度的控制,可以在不使用synchronized的情况下实现线程安全。...
### 原子指令与Lock-Free数据结构 #### 原子指令概述 **原子指令**是一种特殊的硬件指令,能够以不可分割的方式对一个或多个内存位置执行操作。这意味着无论其他处理器正在执行何种指令,原子操作要么全部成功,...
Java 并发学习笔记: 进程和线程, 并发理论, 并发关键字, Lock 体系, 原子操作类, 发容器 & 并发工具, 线程池, 并发实践 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的...
在同步状态的管理上,AQS通过`getState()`和`setState()`方法获取和设置同步状态,而`compareAndSetState()`方法则使用CAS(Compare And Swap)保证了状态更新的原子性,防止并发冲突。 此外,AQS还提供了一种条件...
### Java并发编程笔记 #### 一、线程与进程 - **进程**: 是操作系统资源分配的基本单位,每个进程都有自己的独立内存空间。例如,当我们打开QQ或者音乐播放器时,实际上是在启动`qq.exe`或`Music.exe`这样的程序,...
在Java编程中,原子操作(Atomic Operation)是并发编程中的一种重要概念,它指的是在多线程环境下,某个操作能够不被其他线程中断,保证其完整性。这在并发编程中至关重要,因为线程间的相互干扰可能导致数据不一致...
此外,还可以使用BlockingQueue等高级并发工具进行线程间的数据传递。 以上就是Java并发编程中的关键知识点,掌握这些内容对于理解和编写高效的并发程序至关重要。理解并熟练运用这些工具和机制,可以有效地提升多...
本笔记主要围绕尚硅谷周阳老师的JUC课程展开,旨在帮助个人学习者深入理解和掌握Java并发编程的核心知识。 1. **并发基础** - **线程与进程**:线程是程序执行的最小单位,进程则是资源分配的基本单位。了解它们的...
Java并发笔记可能涵盖了以下几个核心知识点: 1. **线程与进程**:在操作系统中,进程是资源分配的基本单位,而线程是执行的基本单位。Java程序中的线程可以共享同一进程中的资源,创建和切换线程比创建和销毁进程...