- 浏览: 264122 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (88)
- JAVA / base (26)
- JAVA / web (12)
- JAVA / Lib-tools (5)
- SERVER / tomcat (4)
- DB / mysql (4)
- DB / mongodb (2)
- DB / memcached (2)
- DB / redis (2)
- WEB / Front-end (3)
- WEB / security (4)
- WEB / css (2)
- WEB / js (4)
- OS / linux (3)
- IT / Architecture (4)
- IT / other (2)
- Android (9)
- Go (1)
- Other (1)
- OS / Mac (2)
最新评论
-
Zero2Max:
哈哈,马士兵老师也发现了。
java实现接口的bug -
xly1981:
能像CSRF攻击一样带个图就更棒了
XSS跨站攻击 -
xmong:
df274119386 写道在javascript中看到下面的 ...
CSRF攻击与防御策略 -
df274119386:
在javascript中看到下面的语句 e.value = t ...
CSRF攻击与防御策略 -
xmong:
yzxqml 写道xmong 写道yzxqml 写道tomca ...
Tomcat集群
Java实现多线程读写数据
实现需求如下:
当数据没有写线程修改数据时,可以多个读线程读取数据。
当数据有写线程修改数据时,读线程等待,其他写线程也等待,只能有一个写线程修改数据。
当数据没有读线程读数据时,可以有一个写线程修改数据。
当数据有读线程读数据时,写线程不能修改数据。
设计如下:
Data:数据类,用于读写数据的类
ReadWriteLock:读写锁类,实现读写锁控制
ReaderThread:读线程,负责读取数据
WriterThread:写线程,负责写数据
Main:main类
实现如下:
Data:数据类
package com.thread.readwriter; /** * 数据类 * @author Administrator * */ public class Data { //写入数据缓存区 private char[] buffer = new char[10]; //数据的读写锁 private final ReadWriteLock lock = new ReadWriteLock(); /** * 读取数据 * @return * @throws InterruptedException */ public char[] read() throws InterruptedException{ lock.readLock(); try { char[] buffer = doRead(); System.out.println(Thread.currentThread().getName()+" read "+String.valueOf(buffer)); return buffer; } finally { lock.readUnlock(); } } /** * 以字符为单位一次一次的读取缓冲区的数据 * @return */ public char[] doRead(){ char[] newbuffer = new char[buffer.length]; for (int i = 0; i < buffer.length; i++) { newbuffer[i] = buffer[i]; } return buffer; } /** * 写入缓冲区数据 * @param c * @throws InterruptedException */ public void write(char c) throws InterruptedException{ lock.writeLock(); try { System.out.println(Thread.currentThread().getName()+" write "+c); doWrite(c); } finally { lock.writeUnlock(); } } /** * 以字符为单位一次一次地写入缓冲区 * @param c */ public void doWrite(char c){ for (int i = 0; i < buffer.length; i++) { buffer[i] = c; } } }
ReadWriteLock:读写锁类
package com.thread.readwriter; /** * 读写锁类 * @author Administrator * */ public class ReadWriteLock { private int readingNum = 0; //正在读数据的线程数 private int writingNum = 0; //正在写数据的线程数 private int waitingNum = 0; //正在等待写数据的线程数 private boolean writerPriority = true; //写数据优先 /** * 读数据上锁 * @throws InterruptedException */ public synchronized void readLock() throws InterruptedException{ while(writingNum > 0 || (waitingNum > 0 && writerPriority)){ wait(); } readingNum++; } /** * 读数据解锁 */ public synchronized void readUnlock(){ readingNum--; writerPriority = true; notifyAll(); } /** * 写数据上锁 * @throws InterruptedException */ public synchronized void writeLock() throws InterruptedException{ waitingNum++; while(readingNum > 0 || writingNum >0 ){ try { wait(); } finally { waitingNum--; } } writingNum++; } /** * 写数据解锁 */ public synchronized void writeUnlock(){ writingNum--; writerPriority = false; notifyAll(); } }
ReaderThread:读线程类
package com.thread.readwriter; import java.util.Random; public class ReaderThread extends Thread{ //数据 private final Data data; //随机数 private final Random random = new Random(); /** * 读线程构造方法 * @param name 线程名称 * @param data 注入需要读的数据 */ public ReaderThread(String name, Data data){ super(name); this.data = data; } /** * 读取数据 */ public void run(){ while(true){ try { data.read(); Thread.sleep(random.nextInt(500));//随机休息 } catch (InterruptedException e) { e.printStackTrace(); } } } }
WriterThread:写线程类
package com.thread.readwriter; /** * 写入线程类 * @author Administrator * */ public class WriterThread extends Thread{ //数据 private final Data data; //写入字符串 private final String str; //写字符串下标 private int index = 0; /** * 写入线程构造方法 * @param name 线程名称 * @param data 数据存储区 * @param str 写入字符串 */ public WriterThread(String name, Data data, String str){ super(name); this.data = data; this.str = str; } /** * 写入字符串 */ public void run(){ while(true){ try { char c = nextChar(); data.write(c); Thread.sleep(3000); //随机休息 } catch (InterruptedException e) { e.printStackTrace(); } } } /** * 循环从字符串中获取字符 * @return */ private char nextChar(){ char c = str.charAt(index); index++; if(index >= str.length()){ index = 0; } return c; } }
Main:main类
package com.thread.readwriter; /** * main类 * @author Administrator * */ public class Main { public static void main(String[] args) { //数据区 Data data = new Data(); //启动写线程 new WriterThread("WriterThread.1", data, "abcdefghijklmnopkrstuvwxyz").start(); new WriterThread("WriterThread.2", data, "ABCDEFGHIJKLMNOPQRSTUVWXYZ").start(); //启动读线程 new ReaderThread("ReaderThread.1", data).start(); new ReaderThread("ReaderThread.2",data).start(); new ReaderThread("ReaderThread.3",data).start(); new ReaderThread("ReaderThread.4",data).start(); } }
执行结果:
WriterThread.1 write a WriterThread.2 write A ReaderThread.2 read AAAAAAAAAA WriterThread.2 write B ReaderThread.2 read BBBBBBBBBB WriterThread.1 write b ReaderThread.4 read bbbbbbbbbb WriterThread.2 write C ReaderThread.4 read CCCCCCCCCC ReaderThread.2 read CCCCCCCCCC WriterThread.1 write c ReaderThread.3 read cccccccccc WriterThread.2 write D ReaderThread.2 read DDDDDDDDDD WriterThread.1 write d ReaderThread.1 read dddddddddd WriterThread.2 write E ReaderThread.1 read EEEEEEEEEE WriterThread.1 write e ReaderThread.4 read eeeeeeeeee WriterThread.1 write f WriterThread.2 write F ReaderThread.1 read FFFFFFFFFF ReaderThread.4 read FFFFFFFFFF 。。
发表评论
-
Java validation(java验证器实现)
2014-03-18 11:45 3731Java validation 1. java验证器 在 ... -
Memo class备注类信息
2014-03-18 09:52 909Memo Class 1. 什么是Memo Class Mem ... -
java annotation注解
2014-01-24 18:01 9561. Annotation的声明方式 An ... -
Java RMI
2013-03-28 15:12 1744Java Rmi 目录 1 JAVA RMI 1 ... -
java内部类
2013-03-19 16:25 1065Java内部类 目录 1 JAVA ... -
java多线程设计模式之订单模式
2013-03-11 14:00 2715Java多线程实现订单模式: 客户端线程向服务端发起请求后, ... -
java多线程设计模式之线程池处理请求
2013-03-08 17:50 1828Java实现线程池处理请求: 客户端线程发出请求,请求存入请 ... -
java多线程设计模式之异步处理请求
2013-03-08 12:36 4530Java实现多线程异步处理请求: Java实现多线程异步处理 ... -
java多线程设计模式之生产者与消费者
2013-03-07 11:34 1080Java实现多线程生产者与消费者: 生产者线程负责生产产品 ... -
java多线程设计模式之文件保存
2013-03-06 16:16 1630Java实现多线程保存文件:两线程去保存文件,一个保存线程定时 ... -
java多线程设计模式之队列通信
2013-03-06 13:51 2518Java实现多线程处理队列请求通信:客户端线程向请求队列中不断 ... -
Java读linux系统文件文件名乱码
2012-12-06 17:01 91831,问题描述 web应用想通过Java读取linux系统文件显 ... -
Java安全加密
2012-11-28 10:24 2004安全加密 目录 1 加密安全 1 1.1 应用的安全 1 ... -
图着色问题
2012-11-27 13:05 3150图着色问题 目录 1 图 ... -
JDK6新特性
2012-07-03 23:24 2905JDK6的新特性 JDK6的新特性之一_Desktop类 ... -
JDK7新特性
2012-07-03 15:39 3532JDK7新特性 一 JDK7新特性简介 准备 JDK7下载 ... -
JDK5新特性
2012-07-03 10:23 73JDK5.0新特性 1.自动封箱和自动解封(简单类型和封装类 ... -
java多线程
2012-06-15 15:12 1585Java多线程 目录 1 线 ... -
代理模式
2012-06-13 14:12 1397代理模式 目录 1 代理 ... -
java垃圾回收机制
2012-06-11 11:30 2569Java内存回收 目录 1 JAVA内存STACK和HE ...
相关推荐
标题和描述均指向了一个关于Java多线程设计模式的PDF文档的下载链接,这暗示了文档的主要内容将围绕Java中的多线程编程及其设计模式展开。在Java领域,多线程是一个核心概念,它允许程序执行多个任务同时进行,极大...
Java多线程设计模式是Java开发中的重要领域,它涉及到如何高效、安全地利用系统资源进行并发处理。在这个主题中,我们将深入探讨单线程、生产者与消费者模型以及Java中实现多线程的各种方法。 首先,单线程是程序...
Java多线程设计模式是Java开发中的核心概念,它涉及到如何高效、安全地在多个执行线程之间共享资源和协调任务。设计模式是解决特定问题的成熟方案,它们是编程经验的结晶,可以帮助开发者在面临多线程挑战时快速找到...
本资源“java多线程设计模式详解”涵盖了这一主题的深入探讨,包括PDF文档和源码示例。 多线程设计模式是程序员在开发高效、稳定且可维护的多线程应用程序时遵循的一系列最佳实践。以下是一些常见的Java多线程设计...
Java多线程设计模式是Java编程中不可或缺的一部分,它涉及到如何在并发环境下高效、安全地组织代码...阅读提供的"java多线程设计模式详解.pdf"和"Java多线程设计模式源码"文件,将能更深入地理解这些模式的实际运用。
Java多线程设计模式是构建高并发、高性能应用的关键技术之一。这些模式通过优化资源利用、提高程序可读性和可维护性,使并发编程更加高效和安全。以下将详细讲解标题和描述中涉及的一些核心知识点: 1. **线程池...
本资源“Java多线程设计模式上传文件”很可能包含有关如何在Java环境中利用多线程进行文件上传的详细教程。下面我们将深入探讨Java多线程设计模式及其在文件上传中的应用。 1. **线程的基本概念**:在Java中,线程...
### Java多线程设计模式详解 #### 一、Java多线程基础 Java语言自诞生以来,便内置了对多线程的支持。多线程可以让应用程序在同一时间处理多个任务,提高程序的执行效率和响应速度。Java中创建线程有两种基本方式...
在Java编程领域,设计模式和多线程设计模式是开发者必备的技能。设计模式是一种在特定情境下解决软件设计问题的通用、可复用的解决方案,而多线程设计模式则是处理并发问题的关键。本文将深入探讨这两种重要的概念,...
《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为核心篇和设计模式篇,旨在帮助开发者掌握并应用多线程技术。 1. **线程基础** - **线程的创建**:Java提供了两种创建线程...
本文将深入探讨Java多线程设计模式及其源代码,旨在帮助开发者理解和应用这些模式,提升代码的并发性能和可维护性。 1. **生产者消费者模式**:该模式基于`BlockingQueue`,例如`ArrayBlockingQueue`,用于在生产...
Java多线程设计模式是Java并发编程中的一种高级技巧,它可以帮助开发者在处理并发问题时,提高代码的可读性、可维护性和性能。多线程设计模式是基于Java的并发API,如Thread、Runnable、ExecutorService等,通过特定...