`

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

分享到:
评论

相关推荐

    多线程之间的线程通信

    3. **条件变量(Condition Variable)**:线程可以等待某个特定条件满足后才继续执行,这通常与锁结合使用,用于实现线程间的协作。 4. **管道(Pipe)**和**套接字(Socket)**:这些是进程间通信(IPC)的方法,也可以...

    C++实现多线程通信

    在本篇文章中,我们将深入探讨如何在C++中实现多线程通信,以及相关的同步机制和数据交换策略。 一、线程创建与管理 在C++11及以后的标准中,C++提供了`std::thread`库来支持线程的创建和管理。创建一个新线程可以...

    MFC线程间通信

    MFC(Microsoft Foundation Classes)库,作为Windows平台上C++开发的重要框架,提供了丰富的支持来实现线程间通信。本文将深入探讨MFC中的线程间通信技术及其应用。 首先,我们来看全局变量方式。全局变量在整个...

    图书管理线程通信问题

    在IT领域,线程通信是多线程编程中的核心概念,特别是在复杂的系统设计中,如图书管理系统。线程通信指的是不同线程之间交换信息或同步执行的过程,以确保数据的一致性和程序的正确运行。本篇文章将深入探讨线程通信...

    Android实现实时通信示例

    我们可以使用 java.lang.Handler 类来实现线程之间的通信。 实现原理 Android 实时通信示例的实现原理是将发送端和接收端分别放进一个线程去运行,然后利用线程通信类 Handler 来进行线程间的通信,实现界面的实时...

    socket多线程通信源码

    在实际开发中,需要注意的是,多线程通信会带来同步和互斥的问题,需要使用适当的锁机制(如synchronized关键字或Lock接口)来保证数据的一致性。此外,为了防止资源浪费,服务器端在处理完客户端请求后应及时关闭...

    控制台多线程通信 c++ winsock技术

    此外,`std::mutex`可以用来实现线程同步,`std::lock_guard`是一种智能指针,可以自动解锁互斥量,避免了忘记解锁导致的问题。 总结来说,实现控制台多线程通信需要掌握以下几个关键点: 1. Winsock库的使用:包括...

    多线程通信多线程通信

    在IT领域,多线程通信是并发编程中的一个重要概念,特别是在设计复杂的系统或者应用程序时,如QQ这样的即时通讯软件。这个实例旨在通过多线程技术模拟QQ的通信机制,让我们来深入探讨一下这个主题。 首先,多线程是...

    red_line.rar_Red Line_线程 通信

    在C#中,线程通信主要通过共享数据、线程同步机制(如Mutex、Semaphore、Monitor)以及异步操作来实现。 "Red Line"项目采用多线程实现红外线通信,这意味着程序可能同时处理发送和接收红外信号的任务,提高了系统...

    体检程序 HEALTH 用户界面线程 通信.rar_health_用户界面线程_界面线程

    在这个压缩包中,有两个文件:"www.pudn.com.txt"可能是提供额外信息或链接的文本文件,而"classexample 体检程序 HEALTH 用户界面线程 通信"可能是一个源代码文件,包含实现线程通信的示例。 线程是操作系统分配...

    Lock及多线程精华实例

    `Lock`通过创建一个对象的监视器锁来实现线程同步,当一个线程进入`Lock`代码块时,其他试图进入的线程将会被阻塞,直到该线程完成执行并释放锁。这样可以确保对共享资源的互斥访问,防止数据不一致。例如,在ATM机...

    浅析Java中如何实现线程之间通信

    在Java中,有多种方式可以实现线程间的通信,以下将详细解释并举例说明这些方法。 1. **线程的join()方法**: `join()` 方法允许一个线程等待另一个线程完成其执行。在上面的示例中,`A.join()` 让线程 B 在线程 A...

    C++ 多线程通信方式简介并结合生产者-消费者模式代码实现

    本文将深入探讨C++中的多线程通信方式,并结合经典的生产者-消费者模式来阐述其实现。 一、C++多线程基础 C++11引入了标准库`&lt;thread&gt;`,提供了对多线程的支持。创建线程的基本方法是通过`std::thread`类,如下所示...

    Linux应用程序之线程通信

    这些文件很可能是实现线程创建、线程属性设置以及互斥锁的示例代码。其中,`thread_mutex.c`可能涉及互斥锁(mutex)的使用,这是一种常见的线程同步机制,用于保护共享资源免受并发访问。互斥锁允许一次只有一个...

    基于C/S的TCP多线程通信

    本示例“基于C/S的TCP多线程通信”着重讲解了如何利用C#语言实现TCP协议下的多线程通信,这对于理解和开发网络应用程序具有重要意义。 首先,TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于...

    java线程通信

    消息传递是通过对象间的交互来实现线程间通信,每个线程都有自己的私有工作空间,通过发送消息来请求其他线程执行特定操作。Java提供了多种消息传递机制: - wait(), notify()和notifyAll():这些方法定义在...

    Java的多线程-线程间的通信.doc

    Java提供了多种机制来实现线程间的通信,包括使用wait(), notify()和notifyAll()方法,以及使用synchronized关键字控制并发访问共享资源。这些方法都定义在java.lang.Thread类中。 1. **wait(), notify()和...

    Linux开发之线程通信

    【Linux开发之线程通信】深入解析 在Linux操作系统中,多线程编程是一个重要的概念,尤其对于系统级和应用级软件开发来说至关重要。虽然Linux内核最初并未直接实现线程模型,而是通过轻量级进程(LWP,Lightweight ...

    linux上实现多进程和多线程实现同步互斥(源代码)

    - 使用条件变量实现线程间的协作,如生产者消费者模型。 - 实现读写锁,允许多个读取线程并行,写入线程独占。 - 应用信号量控制并发访问的资源数量。 总结,Linux上的多进程和多线程编程涉及复杂的同步互斥操作,...

    java实现多线程文件传输

    7. **线程间通信**:使用`BlockingQueue`或`Future`可以实现线程间的通信,例如,一个线程负责读取文件块并放入队列,另一个线程从队列中取出并发送。 8. **性能调优**:合理设置线程池大小、考虑使用NIO(非阻塞I/...

Global site tag (gtag.js) - Google Analytics