`
badpie
  • 浏览: 5544 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java Code之线程与同步(二)

阅读更多

接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基础,javacode

    此外,Java并发库提供了高级同步机制,如synchronized、Lock、Future等。 以上只是Java基础知识的一部分,实际编程中还会涉及更多的概念和技术,如反射、注解、枚举、Lambda表达式、模块化系统等。持续学习和实践是...

    Java code Java code

    在给定的信息中,我们可以看到一系列与Java编程相关的文件,标题和描述中虽然没有具体的代码内容,但通过标签"Java code"我们可以推断这是一组关于Java编程的源代码文件。下面,我们将根据常见的Java编程知识点,...

    Java Thread Programming (Sams) java线程编程(含code)

    4. **线程同步** - `synchronized`关键字:用于方法或代码块,确保同一时刻只有一个线程执行。 - `volatile`关键字:保证变量在所有线程间可见,防止指令重排序。 - `wait()`, `notify()`, `notifyAll()`:在同步...

    JAVA code example 100 例

    在本资源"JAVA code example 100 例"中,我们拥有一系列精心挑选的Java编程示例,旨在帮助开发者深入理解和应用Java语言。这个压缩包包含了从基础到高级的100个源代码实例,覆盖了Java编程的多个重要方面。下面,...

    java_code.rar_java code

    多线程是Java的一大特色,Java代码实例会展示如何创建线程、同步机制(如synchronized关键字、Lock接口)、线程池的使用,以及并发工具类(如CountDownLatch、CyclicBarrier、Semaphore等)的应用。 网络编程是Java...

    多线程并行执行,汇总结果

    "CountDownLatch" 和 "Thread" 是Java编程语言中实现多线程并行执行的关键工具,它们有助于提高程序的运行效率和响应速度。 **多线程并行执行** 多线程并行执行是指在同一个程序中同时运行多个线程,每个线程负责...

    core java source code

    2. **并发编程**:详细讨论了线程、同步机制、并发工具类,如Semaphore、CyclicBarrier等,以及如何处理线程安全问题。 3. **网络编程**:涵盖了套接字编程,客户端-服务器模型,以及相关的网络API。 4. **GUI编程**...

    corejava_code

    线程间通信和同步使用synchronized关键字、wait(), notify()方法和Lock接口。 8. **泛型**:泛型引入了类型参数,允许在编译时检查类型安全,并且可以重复使用相同代码处理不同的数据类型。例如,List和List是两种...

    支持断点续传java多线程下载.doc

    在多线程下载中,线程同步是关键,以确保数据的正确合并。这通常通过共享对象(如`DownInfo`类中的`startPos`和`endPos`)和适当的同步机制(如`synchronized`关键字或`Lock`接口)来实现,防止不同线程同时修改...

    java实例手册Codesamples

    《Java实例手册Codesamples》是SUN公司发布的一份详细且实用的编程资源,主要针对Java编程语言。这本书籍包含了丰富的代码示例,旨在帮助开发者深入理解和应用Java技术。以下是一些关键知识点的概述: 1. **Java...

    java-code Java语言程序.zip

    - **synchronized关键字**: 用于线程同步,防止数据不一致。 7. **输入/输出(I/O)** - **InputStream, OutputStream**: 基本的字节流处理。 - **Reader, Writer**: 处理字符流。 - **File类**: 操作文件和...

    Java多线程与线程安全实践-基于Http协议的断点续传

    在Java中,我们可以使用`synchronized`关键字或者`java.util.concurrent`包下的工具类来实现线程同步,防止数据竞争。例如,可以使用`synchronized`方法或代码块来控制对共享资源的访问,确保同一时间只有一个线程...

    Java并发:基础线程同步

    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

    Java 创建线程的例子

    在实际开发中,合理使用线程和线程同步技术可以提升程序性能,同时保证程序的正确性和稳定性。本示例提供的代码可能包含了这些概念的应用,具体实现需查看解压后的`codefans.net`文件以获取更多信息。

    java system code

    理解和掌握线程同步机制,如`synchronized`关键字、`wait()`, `notify()`和`notifyAll()`方法,以及`Lock`接口,是编写高效并发程序的关键。 6. **异常处理**: Java的异常处理机制通过`try-catch-finally`块来捕获...

    线程同步与异步套接字编程

    在计算机编程领域,尤其是网络编程中,线程同步与异步套接字编程是至关重要的概念,它们直接影响到程序的性能、稳定性和可扩展性。本文将深入探讨这两个主题,并结合实际应用进行详细阐述。 首先,我们需要理解线程...

    jibu_java_1.0.0.zip_Parallel Java Code_java1.0.0_jibu_java_1.0.0

    《Java多核多线程并行编程库源代码解析》 在现代计算机系统中,多核处理器已经成为标准配置,为了充分利用这些硬件资源,开发者需要掌握并行编程技术。本资源"jibu_java_1.0.0.zip"提供了一个名为"jibu_java_1.0.0...

Global site tag (gtag.js) - Google Analytics