`

Lock实现线程通信

 
阅读更多

 Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象。两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象。

 
读写锁:分为读锁和写锁多个读锁不互斥,读锁与写锁互斥,写锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可。如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁;如果你的代码修改数据,只能有一个人在写,且不能同时读取,那就上写锁。总之,读的时候上读锁,写的时候上写锁! 

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();
        }
        
    
    }
}

分享到:
评论

相关推荐

    Python快速而美丽[v1.0.0][线程通信]

    使用Condition实现线程通信 使用Condition可以让那些已经得到Lock对象却无法继续执行的线程释放Lock对象,Condition对象也可以唤醒其他处于等待状态的线程 将Condition和Lock对象组合使用,可以为每个对象提供多个...

    java中的Lock类和Condition类.docx

    之前已经说道,JVM提供了synchronized关键字来实现对变量的同步访问以及用wait和notify来实现线程间通信。在jdk1.5以后,JAVA提供了Lock类来实现和synchronized一样的功能,并且还提供了Condition来显示线程间通信。...

    java多线程安全性基础介绍.pptx

    各线程之间变量不可见,线程通信通过共享主内存实现。 volatile 仅保证可见性 作用 不会被缓存在寄存器或其他对cpu不可见的地方 强制其他线程读主内存 编译器和运行时不会讲该变量的操作与其他内存操作一起重...

    BAT面试官有点懵系列,Java多线程你真的理解透彻了吗?带你玩转一次多线程!Let’s go!别再out了!

    Future 创建线程三种创建线程方式做出对比线程生命周期线程控制join线程后台线程线程睡眠线程让步yieId线程优先级控制线程同步的“必要性”synchronized线程同步释放同步监视器锁定Lock对象控制线程同步死锁线程通信...

    Java中的Runnable接口最全讲义

    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) 是为完成特定任务、用某种语言编写的一组指令的集合。即指

    程序实验2:11-多线程编程---实验报告.doc

    在实验中,我们使用了printf函数来实现线程之间的通信。每个线程都可以通过printf函数输出自己的状态和结果。 知识点7:多线程编程的挑战 多线程编程也存在一些挑战,如线程的同步和通信、资源的竞争和死锁等问题...

    尚硅谷Java视频_JUC 视频教程

    尚硅谷_JUC线程高级_Condition 线程通信 ·10. 尚硅谷_JUC线程高级_线程按序交替 ·11. 尚硅谷_JUC线程高级_ReadWriteLock 读写锁 ·12. 尚硅谷_JUC线程高级_线程八锁 ·13. 尚硅谷_JUC线程高级_线程池 ·14. ...

    C#线程锁介绍源码

    lock和Monitor是.NET用一个特殊结构实现的,Monitor对象是完全托管的、完全可移植的,并且在操作系统资源要求方 面可能更为有效,同步速度较快,但不能跨进程同步。lock(Monitor.Enter和Monitor.Exit方法的封装)...

    Linux下多线程及多进程及同步与互斥编程详细介绍

    Linux下多线程及多进程及同步与互斥编程详细介绍

    UNIX Linux实验教程 5实验五Linux多线程程序设计.doc

    当父子进程间需要交换信息时,需要借助操作系统提供的进程间通信机制来实现,如信号量、管道、消息通信、共享内存,这些机制通常开销很大,需要在用户程序与内核之间的上下文切换,还要在内存间多次数据拷贝。...

    java多线程编程_java多线程_

    4.讲解了synchronized关键字 , 它使用起来比较麻烦, 所以在Java5中提供了Lock 对象 , 以求能更好地实现并发访问时的同步处理, 包括读写锁等相关技术点。5.讲解了Timer定时器类, 其内部实现就是使用的多线程技术...

    Linux系统编程之线程同步

    lock尝试加锁,如果加锁不成功,线程阻塞,阻塞到持有该互斥量的其他线程解锁为止。 unlock主动解锁函数,同时将阻塞在该锁上的所有线程全部唤醒,至于哪个线程先被唤醒,取决于优先级、调度。默认:先阻塞、先...

    讲给女朋友听的java多线程(2万字深入理解多线程,有实例代码辅助理解)

    线程死锁问题线程通信两个方法sleep()方法和wait()典型例题 读完本文大概需要30分钟左右,本文有大量的实例代码和典型例题帮助大家理解java多线程。虽然多线程比较难以理解,仅靠一篇文章恐怕搞不定。但读完本文最...

    python多进程实现进程间通信实例

    multiprocessing支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。 multiprocessing.Queue() 以Queue为例,在父进程中创建两个子进程,一个往Queue里写数据,一个从Queue...

    Java多线程案例生产者消费者

    多线程通信图解 如何编写一个多线程配合的代码 线程操作资源类。定义一个资源类,并在资源类中完成相应的方法,将资源类作为成员变量传递进线程中进行操作。 如何编写资源类中的方法,判断,干活,通知。先判断现在...

    Python函数式编程

    使用 thread 库可以创建线程、锁和条件变量,以实现线程同步和通信。例如: ``` import thread import time def func(): for i in range(5): print 'func' time.sleep(1) thread.exit() thread.start_new_...

    基于C++实现的连接池、线程池、内存池、对象池项目源码含项目说明.zip

    MySQL数据库编程、单例模式、queue队列容器、C++11多线程编程、线程互斥、线程同步通信和 unique_lock、基于CAS的原子整形、智能指针shared_ptr、lambda表达式、生产者-消费者线程模型 ## CPP线程池 ### 关键技术...

    java高级技术JUC高并发编程教程2021(1.5G)

    java高级技术JUC高并发编程教程2021(1.5G) 〖课程介绍〗: java高级技术JUC高并发编程教程...09-JUC高并发编程-线程间通信-Synchronized实现案例.mp4 10-JUC高并发编程-线程间通信-虚假唤醒问题.mp4 N+ }* P' s3 r&

    Java高级工程师面试宝典

    Condition 的功能类似于在传统的线程技巧中使用 wait() 和 notify() 方法来实现线程之间的通信和同步。Condition 可以 êtreseen 作为一种高级的锁,它具有等待、通知和超时等机制,可以用来实现复杂的同步机制。

Global site tag (gtag.js) - Google Analytics