Lock和Condition是为了替代synchroinzed、wait、notify的,有点是更面向对象,功能上也更强大。下面是一个简单的例子:
class Outputer {
Lock lock = new ReentrantLock();
public void output(String str) {
lock.lock();
try{
for (char c : str.toCharArray()) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.print(c);
}
System.out.println();
}finally{
lock.unlock();
}
}
}
Lock比传统的synchronzied的优点,除了更面向对象外,它还增加了读写锁的功能。
读写锁的优点是,多个读的线程是仍然可以并发的,仅仅是读和写、写和写之间做同步,这样既提高了读时的效率也保证了写时的安全:
ReentrantReadWriteLock wrl = new ReentrantReadWriteLock();
wrl.readLock().lock();
wrl.readLock().unlock();
wrl.writeLock().lock();
wrl.writeLock().unlock();
读写锁的一个应用是在缓存的实现中,读取缓存的时候先上读锁,然后判断在缓存中是否有数据,如果没有,则需要写,这个时候需要先将读锁解掉,然后上写锁,再加载数据,之后再解写锁,上读锁,在官方文档中有一个这样的例子:

Lock与synchronzied对应,与wait()和notify()对应的则是Condition:
你在将出传统的syncrhonized改成Lock之后,会发现wait和notify没法调了,这话时候需要使用Condition:
Condition condition = lock.newCondition();
condition.await();//this.wait();
condition.signal();//this.notify();
Condition较之以前的lock的好处是,之前的lock.wait()和lock.notify()无法根据实际情况去等待和唤醒一个想要的线程。有了Condition之后,可以设置多个condition,线程等待或唤醒是确定的某一个condition,这样在通信上更明确,也更方便了。
分享到:
相关推荐
线程的中断、互斥同步可以通过中断机制、wait/notify机制和`synchronized`关键字实现,线程间的协作可以使用Condition、CountDownLatch、CyclicBarrier等工具类。 在Java中,除了`synchronized`,还有更高级的锁...
`ReentrantLock`是Java并发编程中的一种重要工具,它允许线程在已经获取锁的情况下再次获得同一把锁,而不必等待解锁。这在处理递归调用或嵌套锁的场景中特别有用。`ReentrantLock`提供了一种可选的公平策略,即线程...
以上介绍了 Java 并发编程中几个重要的概念和技术,包括 `ReentrantLock`、`Condition`、`Semaphore`、`ReadWriteLock`、`CountDownLatch`、`CyclicBarrier` 和 `LockSupport`。这些技术为我们提供了丰富的并发控制...
- 条件变量(Condition Variable):线程在条件不满足时等待,条件满足时唤醒。 - 信号量(Semaphore):计数型信号量用于限制对资源的并发访问,二进制信号量类似互斥量。 - 线程间通信还可以使用读写锁、屏障、...
在Java编程领域,多线程并发是不可或缺的一部分,特别是在服务器端和高并发应用中。本文将深入探讨"Java并发编程-线程安全与基础构建模块"这一主题,旨在帮助开发者理解如何有效地处理并发问题,提高程序性能和稳定...
总之,Java并发新特性中的Lock锁和条件变量为开发者提供了更强大的工具来处理多线程同步问题。理解并熟练运用它们,可以编写出更加高效且易于维护的并发代码。在阅读提供的14页PDF文档时,应重点学习Lock的使用场景...
Metux是一个开源的多线程库,它提供了丰富的线程同步原语,如互斥锁(Mutex)、信号量(Semaphore)和条件变量(Condition Variable)等,这些都是实现线程间协同工作的重要工具。在“TestMutex”这个例子中,我们将...
- **线程同步**:包括`synchronized`关键字、`Lock`接口(如`ReentrantLock`)、`Semaphore`信号量、`CountDownLatch`计数器和`CyclicBarrier`屏障等机制,用于控制并发访问资源的顺序和数量,防止数据竞争。...
Condition 接口用于等待和唤醒线程,Lock 接口用于提供锁定操作,ReadWriteLock 接口用于提供读写锁。 Tools 类则提供了一些有用的工具类,例如 LockSupport 类,用于创建锁和其他同步类的基本线程阻塞原语。 2....
【2018最新最详细】并发多线程教程,课程结构如下 1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗...
在IT领域,多线程并发编程是不可或缺的一部分,尤其是在现代计算环境中,为了充分利用多核处理器的优势,提升程序的运行效率,开发者必须掌握这一技术。本文将深入探讨标题为"多线程并发编程参考资料"的宝典,重点...
- **同步机制**:包括`synchronized`关键字、锁(Lock)、条件变量(Condition)等,用于控制多个线程对共享资源的访问,防止数据不一致性。 2. **线程安全**: - **线程不安全**:当多个线程同时访问同一块数据...
6. **线程同步机制**:`std::condition_variable`是线程间的通信工具,可以用来在满足特定条件时唤醒等待的线程。在任务队列的实现中,`m_cond.signal()`用于唤醒等待的消费者线程,而`m_cond.wait()`则让当前线程...
Java中的Lock类与Condition类是Java并发编程的重要组成部分,它们为多线程环境下的同步提供了更为灵活和强大的控制。在JDK 1.5及之后的版本中,Lock类作为替代synchronized关键字的一种方式出现,提供了更精细的锁...
C++提供了多种同步原语,如`std::mutex`(互斥锁)、`std::lock_guard`(互斥锁自动管理器)、`std::condition_variable`(条件变量)等。 3. **线程安全**:如果一个函数或操作在多个线程环境下都能正确工作,那么...
本项目聚焦于使用Java的Socket进行多线程并发控制,并结合Hibernate ORM框架与MySQL数据库进行数据存储。下面将详细阐述这些技术及其应用。 首先,Java Socket是Java提供的用于实现网络上不同计算机间进程通信的...
`lock`语句是C#中用于实现线程同步的重要工具,主要是为了解决多个线程并发访问共享资源时可能出现的竞争条件(race condition)问题。在描述的场景中,`lock`关键字被用来确保在同一时间只有一个线程可以访问特定的...