简述synchronized和java.util.concurrent.locks.Lock的异同
源码来自一篇Java基础题
主要相同点:Lock能完成synchronized所实现的所有功能
主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放(
因为如果不在finally中释放的情况,当抛出异常时,线程直接死掉,但是没有释放锁,使得其他相关线程无法执行。读者可以试试在定义一个数组,并访问越界区,使得程序抛出异常,但是释放锁并未在finally中)。
源码例子:
package test.thread;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class TestLock {
private int j;
private Lock lock = new ReentrantLock();
public static void main(String[] args) {
TestLock tt = new TestLock();
for (int i = 0; i < 2; i++) {
new Thread(tt.new Adder()).start();
new Thread(tt.new Subtractor()).start();
}
}
private class Subtractor implements Runnable {
@Override
public void run() {
for (int i = 0; i < 15; i++) {
// 这里抛异常了,锁能释放吗?会释放,但是lock就不会释放,所以需要加上try..catch
/*synchronized (TestLock.this) {
System.out.println("j--=" +j--);
}*/
lock.lock();
try {
System.out.println("j--=" + j--);
} finally {
lock.unlock();
}
}
}
}
private class Adder implements Runnable {
@Override
public void run() {
for (int i = 0; i < 15; i++) {
/*synchronized (TestLock.this) {
System.out.println("j++="+j++);
}*/
lock.lock();
try {
System.out.println("j++=" + j++);
} finally {
lock.unlock();
}
}
}
}
}
Lock还有更强大的功能,例如,它的tryLock方法可以非阻塞方式去拿锁。
tryLock()
tryLock(long timeout, TimeUnit timeUnit)
trylock()方法:如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;
tryLock(long timeout, TimeUnit timeUnit)方法:如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false;
是不是比synchronized灵活就体现出来了,比如:你现在正在忙于工作,突然感觉内急,于是你跑向洗手间,到门口发现一个“清洁中,暂停使用”的牌牌。没办法,工作又忙,所以你只好先放弃去洗手间回去忙工作,可能如此反复,终于你发现可以进了,于是......
如果用synchronized,当你发现洗手间无法暂时无法进入时,就只能乖乖在门口干等了。
而使用trylock()呢,首先你试着去洗手间,发现暂时无法进入(trylock返回false),于是你继续忙你的工作,如此反复,直到可以进入洗手间为止(trylock返回true)。甚至,你非常急,你可以尝试性的在门口等20秒,不行再去忙工作(trylock(20, TimeUnit.SECONDS);)。
分享到:
相关推荐
Synchronized和java.util.concurrent.locks.Lock都是Java中用于实现线程同步的关键字和接口,它们的主要目标是保证多线程环境下的数据一致性与并发安全。然而,两者在使用方式、控制粒度以及灵活性方面存在显著差异...
1. stop() 和 suspend() 方法为何不推荐使用? 2. sleep() 和 wait() 有什么区别? 3. 同步和异步有何异同,...5. 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同? 6. 概括的解释下线程的几种可用状态。
Java 语言的基本知识,包括逻辑操作、条件操作、interface 和 class 的继承、Java Server Page 和 Servlet 的联系和区别、XML 文档定义形式和解析方式、synchronized 和 java.util.concurrent.locks.Lock 的异同、...
Java提供了两种方式实现线程同步机制,分别是使用synchronized关键字和java.util.concurrent.locks.Lock接口。 线程池的应用: 线程池技术可以应用于Web服务系统中,控制服务器系统的最大并发数与最多处理的任务数...
文章首先介绍了Java多线程同步的必要性和重要性,然后讨论了Java多线程同步机制的实现方法,包括使用synchronized关键字和Java.util.concurrent.locks包中的Lock对象。接着,文章讨论了Java多线程同步机制中可能出现...
6. **管程(Java 5后引入的`java.util.concurrent`包)**:如`java.util.concurrent.locks.Condition`和`java.util.concurrent.CountDownLatch`等,用于协调线程间的协作。 7. **ExecutorService和Future**:`java....
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class SimpleDateFormatExample { private static SimpleDateFormat simpleDateFormat = new ...
`java.util.concurrent.locks.Condition` 接口与 `java.util.concurrent.locks.Lock` 接口一起使用,提供了比`synchronized`更细粒度的控制。Lock提供了获取和释放锁的方法,而Condition则允许线程等待特定条件并被...
3. **Lock接口**:Java提供`java.util.concurrent.locks.Lock`接口,提供了比`synchronized`更细粒度的锁控制,如可重入锁、公平锁等。例如,`ReentrantLock`。 ```java import java.util.concurrent.locks.Lock; ...
- `java.util.concurrent.locks.Lock`接口提供了比`synchronized`更灵活的锁定机制。 #### 六、Java多线程的高级特性 ##### 1. 线程池 - `java.util.concurrent.ExecutorService`接口提供了一种重用固定数量的线程...
3. **`java.util.concurrent.locks`包**:包含锁和条件变量的实现,如`ReentrantLock`、`ReadWriteLock`等,它们提供了比`synchronized`更灵活的锁机制。 4. **`java.util.concurrent.atomic`和`java.util....
`synchronized`关键字和`java.util.concurrent.locks`包中的锁机制是实现线程安全的关键。 6. **日期/时间API**:在Java 8之后,`java.time`包取代了传统的`java.util.Date`和`java.util.Calendar`,提供了更加友好...
为了解决这一问题,Java提供了更细粒度的锁,如`java.util.concurrent.locks.ReentrantLock`,它具有与`synchronized`相似的功能,但提供了更多的灵活性,如可中断的等待、定时等待和尝试获取锁。 此外,`java.util...
- `java.util.concurrent.locks`:提供了更灵活的锁定机制,包括`Lock`和`Condition`接口,支持更复杂的线程同步需求。 ### 2. Callable和Future接口 `Callable`接口类似于`Runnable`,但可以返回一个结果,并且...
`java.util.concurrent.locks`包中提供了比`synchronized`关键字更强大、更灵活的锁实现——`ReentrantLock`。 **2.2.1 `ReentrantLock`特性** - 支持公平锁和非公平锁的选择。 - 提供尝试获取锁的能力,可以指定...
4. **java.util.concurrent.locks** 包:这个包提供了高级锁机制,包括ReentrantLock、ReadWriteLock等。ReentrantLock可重入锁比内置的synchronized更灵活,提供了公平性和非公平性选择,以及尝试锁定、定时锁定...
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Counter { private Lock lock = new ReentrantLock(); private int count = 0; public void ...
3. synchronized和java.util.concurrent.locks.Lock的异同:Lock能完成synchronized所实现的全部功能,但是Lock有比synchronized更精确的线程语义和更好的性能。 日期格式化 1. 使用Date对象来格式化日期。 2. ...
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; Lock lock = new ReentrantLock(); lock.lock(); // 获取锁 try { // 临界区代码 } finally { lock.unlock(); // ...
import java.util.concurrent.locks.ReentrantLock; public class ConditionExample { private final ReentrantLock lock = new ReentrantLock(); private final Condition condition = lock.newCondition(); ...