接Java Code之线程与同步(一)的例子,使用synchronized来挂锁。实际上这个锁的效率并不高,分析一下,如果门外排队的都是读数据的人,那么这些人是可以同时进入屋子里的,他们不会影响数据的配对。也就是说可以多个读数据操作同时进行,写数据操作只能同时有一个,并且在写数据时,不能读数据。
Java中就有一个这样的挂锁机制,看代码:
如之前的例子,只需修改FileManager.java
package com.iteye.badpie.javacode.thread.sync; import java.util.Random; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class FileManager { private Random mRandom; private String mName = "默认名字"; private String mEmail = "默认电子邮件"; private Lock mReadLock; private Lock mWriteLock; public FileManager() { mRandom = new Random(); // 构建读写锁 ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock(); mReadLock = rwLock.readLock(); mWriteLock = rwLock.writeLock(); } public void write(String id, String name, String email) { // 写锁 mWriteLock.lock(); mName = name; try { Thread.sleep(getRandomInt()); } catch (InterruptedException e) { e.printStackTrace(); } mEmail = email; System.out.println(String.format("写数据 id:%s, name:%s, email:%s", id, name, email)); // 解写锁 mWriteLock.unlock(); } public void read(String id) { // 读锁 mReadLock.lock(); try { Thread.sleep(getRandomInt()); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(String.format("读数据 id:%s, name:%s, email:%s", id, mName, mEmail)); // 解读锁 mReadLock.unlock(); } private int getRandomInt() { return mRandom.nextInt(2000); } }
再次运行,结果如下:
主线程开始运行 主线程运行结束 读数据 id:r, name:默认名字, email:默认电子邮件 写数据 id:w, name:0的名字, email:0的电子邮件 读数据 id:r, name:0的名字, email:0的电子邮件 写数据 id:w, name:1的名字, email:1的电子邮件 读数据 id:r, name:1的名字, email:1的电子邮件 写数据 id:w, name:2的名字, email:2的电子邮件 读数据 id:r, name:2的名字, email:2的电子邮件 写数据 id:w, name:3的名字, email:3的电子邮件 写数据 id:w, name:4的名字, email:4的电子邮件 读数据 id:r, name:4的名字, email:4的电子邮件
很明显,区分了读和写的锁,线程的调度更加均匀,效率更高了。
相关推荐
此外,Java并发库提供了高级同步机制,如synchronized、Lock、Future等。 以上只是Java基础知识的一部分,实际编程中还会涉及更多的概念和技术,如反射、注解、枚举、Lambda表达式、模块化系统等。持续学习和实践是...
在给定的信息中,我们可以看到一系列与Java编程相关的文件,标题和描述中虽然没有具体的代码内容,但通过标签"Java code"我们可以推断这是一组关于Java编程的源代码文件。下面,我们将根据常见的Java编程知识点,...
4. **线程同步** - `synchronized`关键字:用于方法或代码块,确保同一时刻只有一个线程执行。 - `volatile`关键字:保证变量在所有线程间可见,防止指令重排序。 - `wait()`, `notify()`, `notifyAll()`:在同步...
在本资源"JAVA code example 100 例"中,我们拥有一系列精心挑选的Java编程示例,旨在帮助开发者深入理解和应用Java语言。这个压缩包包含了从基础到高级的100个源代码实例,覆盖了Java编程的多个重要方面。下面,...
多线程是Java的一大特色,Java代码实例会展示如何创建线程、同步机制(如synchronized关键字、Lock接口)、线程池的使用,以及并发工具类(如CountDownLatch、CyclicBarrier、Semaphore等)的应用。 网络编程是Java...
"CountDownLatch" 和 "Thread" 是Java编程语言中实现多线程并行执行的关键工具,它们有助于提高程序的运行效率和响应速度。 **多线程并行执行** 多线程并行执行是指在同一个程序中同时运行多个线程,每个线程负责...
2. **并发编程**:详细讨论了线程、同步机制、并发工具类,如Semaphore、CyclicBarrier等,以及如何处理线程安全问题。 3. **网络编程**:涵盖了套接字编程,客户端-服务器模型,以及相关的网络API。 4. **GUI编程**...
线程间通信和同步使用synchronized关键字、wait(), notify()方法和Lock接口。 8. **泛型**:泛型引入了类型参数,允许在编译时检查类型安全,并且可以重复使用相同代码处理不同的数据类型。例如,List和List是两种...
在多线程下载中,线程同步是关键,以确保数据的正确合并。这通常通过共享对象(如`DownInfo`类中的`startPos`和`endPos`)和适当的同步机制(如`synchronized`关键字或`Lock`接口)来实现,防止不同线程同时修改...
《Java实例手册Codesamples》是SUN公司发布的一份详细且实用的编程资源,主要针对Java编程语言。这本书籍包含了丰富的代码示例,旨在帮助开发者深入理解和应用Java技术。以下是一些关键知识点的概述: 1. **Java...
- **synchronized关键字**: 用于线程同步,防止数据不一致。 7. **输入/输出(I/O)** - **InputStream, OutputStream**: 基本的字节流处理。 - **Reader, Writer**: 处理字符流。 - **File类**: 操作文件和...
在Java中,我们可以使用`synchronized`关键字或者`java.util.concurrent`包下的工具类来实现线程同步,防止数据竞争。例如,可以使用`synchronized`方法或代码块来控制对共享资源的访问,确保同一时间只有一个线程...
3.Using conditions in synchronized code; 4.Synchronizing a block of code with a Lock; 5.Synchronizing data access with read/write locks 6.Modifying Lock fairness 7.Using multiple conditions in a Lock
在实际开发中,合理使用线程和线程同步技术可以提升程序性能,同时保证程序的正确性和稳定性。本示例提供的代码可能包含了这些概念的应用,具体实现需查看解压后的`codefans.net`文件以获取更多信息。
理解和掌握线程同步机制,如`synchronized`关键字、`wait()`, `notify()`和`notifyAll()`方法,以及`Lock`接口,是编写高效并发程序的关键。 6. **异常处理**: Java的异常处理机制通过`try-catch-finally`块来捕获...
在计算机编程领域,尤其是网络编程中,线程同步与异步套接字编程是至关重要的概念,它们直接影响到程序的性能、稳定性和可扩展性。本文将深入探讨这两个主题,并结合实际应用进行详细阐述。 首先,我们需要理解线程...
《Java多核多线程并行编程库源代码解析》 在现代计算机系统中,多核处理器已经成为标准配置,为了充分利用这些硬件资源,开发者需要掌握并行编程技术。本资源"jibu_java_1.0.0.zip"提供了一个名为"jibu_java_1.0.0...