Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象。两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象。
public static void main(String[] args) {
new ReentrantLockTest().init();
}
public void init(){
final Printer printer = new Printer();
new Thread(){
@Override
public void run() {
while(true){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
printer.print("youyang");
}
}
}.start();
new Thread(){
@Override
public void run() {
while(true){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
printer.print("yusiyi");
}
}
}.start();
}
class Printer {
private Lock lock = new ReentrantLock();
public void print(String string){
lock.lock();
try{
for(int i=0;i<string.length();i++){
System.out.print(string.charAt(i));
}
System.out.println();
}finally{
lock.unlock();
}
}
}
public class ReadWriteLockTest {
public static void main(String[] args) {
final Queue3 q3 = new Queue3();
for(int i=0;i<3;i++)
{
new Thread(){
public void run(){
while(true){
q3.get();
}
}
}.start();
new Thread(){
public void run(){
while(true){
q3.put(new Random().nextInt(10000));
}
}
}.start();
}
}
}
class Queue3{
private Object data = null;//共享数据,只能有一个线程能写该数据,但可以有多个线程同时读该数据。
ReadWriteLock rwl = new ReentrantReadWriteLock();
public void get(){
rwl.readLock().lock();
try {
System.out.println(Thread.currentThread().getName() + " be ready to read data!");
Thread.sleep((long)(Math.random()*1000));
System.out.println(Thread.currentThread().getName() + "have read data :" + data);
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
rwl.readLock().unlock();
}
}
public void put(Object data){
rwl.writeLock().lock();
try {
System.out.println(Thread.currentThread().getName() + " be ready to write data!");
Thread.sleep((long)(Math.random()*1000));
this.data = data;
System.out.println(Thread.currentThread().getName() + " have write data: " + data);
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
rwl.writeLock().unlock();
}
}
}
相关推荐
使用Condition实现线程通信 使用Condition可以让那些已经得到Lock对象却无法继续执行的线程释放Lock对象,Condition对象也可以唤醒其他处于等待状态的线程 将Condition和Lock对象组合使用,可以为每个对象提供多个...
之前已经说道,JVM提供了synchronized关键字来实现对变量的同步访问以及用wait和notify来实现线程间通信。在jdk1.5以后,JAVA提供了Lock类来实现和synchronized一样的功能,并且还提供了Condition来显示线程间通信。...
各线程之间变量不可见,线程通信通过共享主内存实现。 volatile 仅保证可见性 作用 不会被缓存在寄存器或其他对cpu不可见的地方 强制其他线程读主内存 编译器和运行时不会讲该变量的操作与其他内存操作一起重...
Future 创建线程三种创建线程方式做出对比线程生命周期线程控制join线程后台线程线程睡眠线程让步yieId线程优先级控制线程同步的“必要性”synchronized线程同步释放同步监视器锁定Lock对象控制线程同步死锁线程通信...
7. 线程通信: 7.1 使用wait()和notify()方法 7.2 使用Lock和Condition 8. 线程池: 8.1 线程池的概述 8.2 使用Executor框架创建线程池 8.3 线程池的优势和适用场景 9. 线程中断: 9.1 如何中断线程 9.2 处理中断...
目录1. 基本概念1.1 进程与线程1.2 并行与并发2.... 线程通信6.1 常用方法7. 死锁(以后补充) 1. 基本概念 1.1 进程与线程 程序(program) 是为完成特定任务、用某种语言编写的一组指令的集合。即指
在实验中,我们使用了printf函数来实现线程之间的通信。每个线程都可以通过printf函数输出自己的状态和结果。 知识点7:多线程编程的挑战 多线程编程也存在一些挑战,如线程的同步和通信、资源的竞争和死锁等问题...
尚硅谷_JUC线程高级_Condition 线程通信 ·10. 尚硅谷_JUC线程高级_线程按序交替 ·11. 尚硅谷_JUC线程高级_ReadWriteLock 读写锁 ·12. 尚硅谷_JUC线程高级_线程八锁 ·13. 尚硅谷_JUC线程高级_线程池 ·14. ...
lock和Monitor是.NET用一个特殊结构实现的,Monitor对象是完全托管的、完全可移植的,并且在操作系统资源要求方 面可能更为有效,同步速度较快,但不能跨进程同步。lock(Monitor.Enter和Monitor.Exit方法的封装)...
Linux下多线程及多进程及同步与互斥编程详细介绍
当父子进程间需要交换信息时,需要借助操作系统提供的进程间通信机制来实现,如信号量、管道、消息通信、共享内存,这些机制通常开销很大,需要在用户程序与内核之间的上下文切换,还要在内存间多次数据拷贝。...
4.讲解了synchronized关键字 , 它使用起来比较麻烦, 所以在Java5中提供了Lock 对象 , 以求能更好地实现并发访问时的同步处理, 包括读写锁等相关技术点。5.讲解了Timer定时器类, 其内部实现就是使用的多线程技术...
lock尝试加锁,如果加锁不成功,线程阻塞,阻塞到持有该互斥量的其他线程解锁为止。 unlock主动解锁函数,同时将阻塞在该锁上的所有线程全部唤醒,至于哪个线程先被唤醒,取决于优先级、调度。默认:先阻塞、先...
线程死锁问题线程通信两个方法sleep()方法和wait()典型例题 读完本文大概需要30分钟左右,本文有大量的实例代码和典型例题帮助大家理解java多线程。虽然多线程比较难以理解,仅靠一篇文章恐怕搞不定。但读完本文最...
multiprocessing支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。 multiprocessing.Queue() 以Queue为例,在父进程中创建两个子进程,一个往Queue里写数据,一个从Queue...
多线程通信图解 如何编写一个多线程配合的代码 线程操作资源类。定义一个资源类,并在资源类中完成相应的方法,将资源类作为成员变量传递进线程中进行操作。 如何编写资源类中的方法,判断,干活,通知。先判断现在...
使用 thread 库可以创建线程、锁和条件变量,以实现线程同步和通信。例如: ``` import thread import time def func(): for i in range(5): print 'func' time.sleep(1) thread.exit() thread.start_new_...
MySQL数据库编程、单例模式、queue队列容器、C++11多线程编程、线程互斥、线程同步通信和 unique_lock、基于CAS的原子整形、智能指针shared_ptr、lambda表达式、生产者-消费者线程模型 ## CPP线程池 ### 关键技术...
java高级技术JUC高并发编程教程2021(1.5G) 〖课程介绍〗: java高级技术JUC高并发编程教程...09-JUC高并发编程-线程间通信-Synchronized实现案例.mp4 10-JUC高并发编程-线程间通信-虚假唤醒问题.mp4 N+ }* P' s3 r&
Condition 的功能类似于在传统的线程技巧中使用 wait() 和 notify() 方法来实现线程之间的通信和同步。Condition 可以 êtreseen 作为一种高级的锁,它具有等待、通知和超时等机制,可以用来实现复杂的同步机制。