- 浏览: 30580 次
- 性别:
- 来自: 杭州
文章分类
最新评论
ReadWriteLock是实现多线程环境下同步的一种方式。与synchronized相比,它在读的频率大于写的频率的时候,效率有很大的提升。而且拥有writelock的情况下还可以拥有readlock,相反则不能。
提供一个多线程环境的资源类
package zl.readandwrite.date;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class DateUtil {
private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private Lock readLock = readWriteLock.readLock();
private Lock writeLock = readWriteLock.writeLock();
private String date = "2012-10-10" ;
public String get() {
String date = null ;
readLock.lock();
try {
System.out.println(Thread.currentThread().getName());
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName());
date = this.date ;
return date ;
} catch (InterruptedException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} finally {
readLock.unlock();
}
return null ;
}
public void set(String date) {
writeLock.lock() ;
try {
System.out.println(Thread.currentThread().getName());
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName());
this.date = date ;
} catch (InterruptedException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} finally {
writeLock.unlock();
}
}
}
提供一个线程类:
package zl.readandwrite.thread;
import zl.readandwrite.date.DateUtil;
public class DateThread extends Thread {
private boolean flag ;
private DateUtil dateUtil ;
public DateThread(boolean flag , DateUtil dateUtil) {
this.flag = flag ;
this.dateUtil = dateUtil ;
}
public void run() {
if(flag)
dateUtil.get();
else
dateUtil.set("2011-11-11");
}
}
测试代码:
import zl.readandwrite.date.DateUtil;
import zl.readandwrite.thread.DateThread;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
DateUtil dateUtil = new DateUtil() ;
Thread date1 = new DateThread(true , dateUtil );
Thread date2 = new DateThread(false , dateUtil );
date1.setName("读数据1");
date2.setName("写数据2");
date2.start();
date1.start();
}
}
输出:
写数据2
写数据2
读数据1
读数据1
提供一个多线程环境的资源类
package zl.readandwrite.date;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class DateUtil {
private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private Lock readLock = readWriteLock.readLock();
private Lock writeLock = readWriteLock.writeLock();
private String date = "2012-10-10" ;
public String get() {
String date = null ;
readLock.lock();
try {
System.out.println(Thread.currentThread().getName());
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName());
date = this.date ;
return date ;
} catch (InterruptedException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} finally {
readLock.unlock();
}
return null ;
}
public void set(String date) {
writeLock.lock() ;
try {
System.out.println(Thread.currentThread().getName());
Thread.sleep(2000);
System.out.println(Thread.currentThread().getName());
this.date = date ;
} catch (InterruptedException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} finally {
writeLock.unlock();
}
}
}
提供一个线程类:
package zl.readandwrite.thread;
import zl.readandwrite.date.DateUtil;
public class DateThread extends Thread {
private boolean flag ;
private DateUtil dateUtil ;
public DateThread(boolean flag , DateUtil dateUtil) {
this.flag = flag ;
this.dateUtil = dateUtil ;
}
public void run() {
if(flag)
dateUtil.get();
else
dateUtil.set("2011-11-11");
}
}
测试代码:
import zl.readandwrite.date.DateUtil;
import zl.readandwrite.thread.DateThread;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
DateUtil dateUtil = new DateUtil() ;
Thread date1 = new DateThread(true , dateUtil );
Thread date2 = new DateThread(false , dateUtil );
date1.setName("读数据1");
date2.setName("写数据2");
date2.start();
date1.start();
}
}
输出:
写数据2
写数据2
读数据1
读数据1
发表评论
-
aaaaaaaaaaaa
2014-08-30 09:01 0111111111111111 -
struts2与checkbox的关系
2014-03-25 15:35 628Struts2 框架对checkbox的处理 1、 对于htm ... -
doc命令之关机管理
2014-03-21 09:26 690@echo off set /p p=是否关机(1:关机 2: ... -
金字塔最短路径
2014-03-18 10:02 581class Triangle { private int[] ... -
汉诺塔递归算法
2014-03-15 10:49 588class Hanio { private int st ... -
回溯算法之八皇后
2014-03-13 13:27 610public class EightQueens { ... -
xml的基本学习
2014-03-04 15:17 8871、 XML的概念 允许开发 ... -
软件生命三大测试的概念和区别
2014-02-17 22:01 0根据不同的测试阶段,测试可以分为单元测试、集成测试、系统测试和 ... -
Session处理同账号管理
2013-10-22 17:19 782首先使用HttpSessionAttributeListene ... -
线程概念
2013-03-20 21:06 0线程对可共享的、可改变的状态变量进行访问,需要实现协同,否则数 ... -
KMP算法
2013-03-20 14:10 930package zl.character.compare; ... -
parseInt惹的祸
2013-03-04 17:57 819今天项目在实施的过程中,出现了让我懊恼的事情: 卡的金额读不出 ... -
Unable to retrieve metadata for procedure
2013-03-01 13:51 3923第一次用jdbc调用mysql存储过程的过程中犯了一个严重的错 ... -
JDK动态代理和CGLIB动态代理的学习
2012-10-08 17:25 0JDK动态代理是基于java.lang.reflect.Pro ... -
log4j输出spring框架的信息
2012-10-08 17:00 0log4j.logger.org.springframewor ... -
WIN7 BCompare 启动应用程序发生错误
2012-08-24 11:26 1149WIN7下寻找: 把C:\用户\[用户名]\AppData\S ... -
ant
2012-08-24 11:15 0当使用-jar执行可执行Jar包时,JVM将Jar包所在目录设 ... -
spring框架后处理器的学习
2012-07-27 09:22 744spring框架对容器管理bean和容器本身提供了额外增强功能 ... -
socket简单通讯
2012-07-26 17:09 812package zl.socket.server; impo ... -
java命令执行class文件
2012-07-26 14:30 715eclipse编译出来的class文件如果带有包结构,请在命令 ...
相关推荐
Java提供了一些线程安全的集合类,如ConcurrentHashMap、CopyOnWriteArrayList和CopyOnWriteArraySet,它们在多线程环境下提供了高并发的访问性能。 九、死锁检测与避免 死锁是多线程编程中的常见问题,两个或多个...
JMM还定义了八种操作来完成主内存和工作内存之间的变量访问,这些操作包括lock、unlock、read、load、use、assign、store和write,这些操作确保了多线程之间的内存访问同步。 在Netty5中,多线程并发编程的应用主要...
通过学习和掌握以上Java多线程的知识点,你将能够编写出更加健壮、高效的多线程程序,有效应对并发场景下的各种挑战。在实际开发中,结合具体业务需求,灵活运用这些概念和工具,可以大大提高代码质量和系统性能。
读写锁(ReadWriteLock)是多线程编程中一种重要的同步机制,主要用于提高并发性能。在Windows环境下,C++可以通过自定义实现或者使用系统提供的API来创建读写锁。在这个项目中,`ReadWriteLock.cpp` 和 `...
在多线程环境下,数据共享可能会引发数据不一致的问题。Java提供了多种同步机制,如synchronized关键字、volatile变量、Lock接口(ReentrantLock、ReadWriteLock等)和Semaphore信号量。synchronized提供互斥访问,...
Java多线程之readwritelock读写分离的实现代码主要介绍了Java多线程之readwritelock读写分离的相关内容,文中涉及具体实例代码,具有一定参考价值,需要的朋友可以了解下。 在多线程开发中,经常会出现一种情况,...
6. **finally块**:在多线程代码中,`try-finally`结构通常用于确保在任何情况下都能执行清理操作,比如关闭文件流、网络连接等。 7. **线程局部变量(ThreadLocal)**:这些变量为每个线程提供独立的副本,避免了...
并发集合操作:展示如何在多线程环境下安全地操作集合类,如ConcurrentHashMap和CopyOnWriteArrayList。 线程生命周期管理:示例代码展示如何创建、启动、管理和终止线程。 线程通信:展示线程间的通信机制,包括...
Java多线程与锁是Java并发编程中的核心概念,它们对于构建高效、可扩展的并发应用程序至关重要。在Java中,多线程允许程序同时执行多个任务,提高CPU的利用率,而锁则是用来控制多线程间共享资源的访问,确保数据的...
Java多线程设计模式是构建高并发、高性能应用的关键技术之一。这些模式通过优化资源利用、提高程序可读性和可维护性,使并发编程更加高效和安全。以下将详细讲解标题和描述中涉及的一些核心知识点: 1. **线程池...
在多线程环境下,共享状态是引发冲突的主要源头。如果可能,应尽量减少类和对象的共享状态,或者完全避免它们。可以使用以下策略来降低共享: 1. 使用不可变对象:不可变对象一旦创建就无法改变其状态,因此它们在...
在当今的互联网时代,特别是在产业互联网和5G技术的推动下,多线程和高并发的应用变得越来越广泛,它们是构建高性能服务器、桌面应用、移动应用、云计算和大数据处理系统等技术的基础。 首先,我们需要了解什么是...
- 多任务是指操作系统能够同时处理多个任务的能力,而多线程则是实现多任务的一种方式。 - 在Java中,线程的执行不是真正意义上的“同时”,而是通过时间片轮换来模拟多任务的执行。 - **Java中的线程**: - 在...
8. **Atomic类**: `Atomic`系列类提供了原子操作,如`AtomicInteger`、`AtomicLong`等,可以在多线程环境下保证数据更新的原子性和可见性,无需显式同步。 在"多线程例子"这个压缩包中,可能包含了上述各种并发工具...
在设计多线程程序时,需要考虑多线程环境下资源共享、线程同步、死锁避免、性能优化等诸多问题。以下将详细介绍Java多线程设计模式中常见的知识点。 首先,线程同步是多线程设计中的核心问题之一。在多线程环境中,...
- 当前的操作系统通常为多任务操作系统,多线程是实现多任务的一种手段。 - **进程**:指内存中运行的应用程序,每个进程拥有独立的内存空间。例如,在Windows系统中,一个运行中的exe文件就是一个进程。 - **...
在Java中,多线程允许程序同时执行多个不同的任务,这极大地提高了程序的执行效率和响应速度,特别是在处理并发用户请求、进行大量I/O操作或计算密集型任务时。 首先,我们来理解一下什么是线程。线程是操作系统...
这些操作在多线程环境下是原子的,避免了并发时可能出现的数据不一致问题。此外,Interlocked类还提供了Exchange和CompareExchange方法,分别用于原子地交换变量的值和比较交换,这在实现更复杂的同步逻辑时非常有用...
2. **线程同步**:为了避免多线程环境中的数据竞争问题,Java提供了多种同步机制,如synchronized关键字、Lock接口(ReentrantLock、ReadWriteLock等)、Semaphore信号量、CountDownLatch倒计时器等。这些工具可以...