`

Lock&Condition实现线程同步通信

 
阅读更多

Java1.5提供了锁机制,位于java.util.current.locks下面

 

Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,本身也应该是一个对象。
两个线程执行的代码片段要实现同步互斥的效果,它们徐用同一个Lock对象。锁是上在代表要操作的资
源的类的内部方法中,而不是线程代码中。
读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,写锁与写锁互斥
这是由JVM自己控制的,你只要上号相应的锁即可。如果你的代码只读数据,可以多人同时读,但不能同时写,那就上读锁;如果你的代码修改数据。
只能有一个在写,且不能同时读取,那就上写锁。总之,读的时候上读锁,写的时候上写锁。

  

package com.ronbay.thread.timer;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class LockTest {
	public static void main(String[] args) {
		new LockTest().init();
	}
	
	private  void init(){
		final Outputer outputer = new Outputer();
		new Thread(new Runnable() {
			@Override
			public void run() {
				while(true){
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					outputer.output("saiwegang");
				}
			}
		}).start();
		new Thread(new Runnable() {
			@Override
			public void run() {
				while(true){
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					outputer.output("shilongfei");
				}
			}
		}).start();
	}
	
	static class Outputer{
		Lock lock = new ReentrantLock();
		public void output(String name){
			int len = name.length();
			lock.lock();
			try {
				for (int i = 0; i < len; i++) {
					System.out.print(name.charAt(i));
				}
				System.out.println();
			} catch (Exception e) {
				e.printStackTrace();
			}finally{
				lock.unlock();
			}
		}
	}
}

 

分享到:
评论

相关推荐

    传统线程同步通信技术一

    本文将深入探讨传统线程同步通信技术,主要包括临界区、信号量、互斥量以及事件对象。 1. **临界区**(Critical Section) 临界区是程序中用于访问共享资源的代码段。为了防止多个线程同时进入临界区,我们可以...

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

    线程间的同步互斥通常通过以下方法实现: 1. 互斥锁(Mutex):使用`pthread_mutex_init()`初始化互斥锁,`pthread_mutex_lock()`和`pthread_mutex_unlock()`进行锁定和解锁。当一个线程获得锁后,其他试图获取该锁...

    多线程同步和通讯完整示例

    synchronized关键字提供了基本的线程同步,而wait-notify机制和Lock接口则提供了更高级的线程通讯和控制手段。在实际开发中,根据具体需求选择合适的同步策略,可以提高程序的效率和正确性。通过学习和实践...

    3种多线程实现同步方法

    本篇文章将深入探讨三种在C++中实现多线程同步的方法:事件对象、关键代码段和互斥对象。 首先,我们来看**事件对象**。事件对象是一种信号机制,用于线程间通信和同步。在Windows API中,CreateEvent函数创建一个...

    多线程之间的线程通信

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

    多线程的批量线程同步解决方案

    "多线程的批量线程同步解决方案"这个标题暗示我们探讨的是如何在多线程环境下有效地管理和同步多个任务,确保数据一致性与程序正确性。下面将详细阐述相关知识点。 一、多线程基础 多线程是指在一个进程中同时执行...

    C++实现多线程通信

    三、线程同步 1. **互斥量(Mutex)**:`std::mutex`用于保护临界区,确保同一时间只有一个线程可以访问受保护的资源。使用`lock()`和`unlock()`来锁定和解锁,或使用RAII风格的`std::unique_lock`。 ```cpp std::...

    JavaLock与Condition的理解Reentran

    总结,Java Lock与Condition的使用能够帮助开发者更好地控制线程的同步和通信,提升多线程程序的效率和可控性。ReentrantLock作为其中的核心,提供了丰富的特性,而Condition则是实现复杂并发逻辑的重要工具。理解并...

    Java使用Condition控制线程通信的方法实例详解

    * Condition 可以实现更高级的线程同步机制。 * Condition 可以在多个线程之间实现更好的协调和通信。 * Condition 可以实现更灵活的等待和唤醒机制。 Condition 的应用场景: * 在银行系统中,使用 Condition ...

    Python线程协作threading.Condition实现过程解析

    在Python的多线程编程中,`threading.Condition`是一个重要的工具,用于实现线程间的协作和同步。本文将深入解析`threading.Condition`的工作原理和实现过程,并通过一个简单的男女对话示例来阐述其使用方法。 `...

    线程示例(有注释,包括同步,线程间通信)

    ReentrantLock还提供了Condition接口,可以创建多个条件变量,实现更复杂的线程同步和通信。 4. **CountDownLatch**:这是一个计数器类,用于协调多个线程之间的同步。在开始执行前,线程需要等待计数器归零才能...

    线程的几种控制方式以及线程间的几种通信方式

    3. **线程同步**:为了避免多个线程同时访问共享资源导致数据不一致,引入了线程同步机制。主要包括Java的`synchronized`关键字、Python的`Lock`对象等。 4. **线程间通信**:线程间通信允许线程之间交换信息,Java...

    Java编程中实现Condition控制线程通信

    Java中的Lock接口及其实现,如ReentrantLock,提供了更高级的线程通信机制,其中包括Condition接口。 Condition接口是Java并发包java.util.concurrent.locks的一部分,它允许我们创建特定于锁的等待集合。相比于...

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

    - Java 5引入了Lock接口和Condition接口,作为synchronized关键字的替代品,提供了更灵活的线程同步和通信。Lock接口提供了lock(), unlock(), newCondition()等方法,Condition接口则提供了await(), signal()和...

    java中的Lock类和Condition类.docx

    通过上述内容,我们可以看出,Lock和Condition类提供了比synchronized更高级别的线程同步和通信机制,使得开发者能够更好地控制线程的执行顺序,提高并发程序的效率和可控性。在实际开发中,根据具体需求选择使用...

    生产者-消费者(lock和condition).zip

    总结,"生产者-消费者(lock和condition).zip"的示例代码可能展示了如何利用Java的`Lock`和`Condition`接口有效地解决并发问题,实现生产者和消费者之间的同步和通信。这个模型对于理解和掌握Java并发编程是非常有...

    swift NSThread线程同步买票小例子

    在Swift中,我们可以使用GCD(Grand Central Dispatch)或者NSOperationQueue来实现线程同步,但这个例子是基于NSThread的,所以我们讨论一下如何在NSThread中实现同步。 1. **锁(Locks)**:在NSThread中,我们...

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

    二、线程同步与通信 在多线程环境中,数据共享可能导致竞态条件和死锁等问题。C++提供了一些同步机制来解决这些问题: 1. **互斥量(Mutex)**:`std::mutex`用于保护共享资源,确保同一时间只有一个线程访问。 ```...

Global site tag (gtag.js) - Google Analytics