- 浏览: 57612 次
- 性别:
- 来自: 北京
文章分类
最新评论
1:lock和synchronized对比
[java]
view plain
copy
- import java.util.concurrent.locks.Lock;
- import java.util.concurrent.locks.ReentrantLock;
- public class LockTest {
- /**
- * @param args
- */
- 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) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- outputer.output("zhangxiaoxiang" );
- }
- }
- }).start();
- new Thread( new Runnable(){
- @Override
- public void run() {
- while ( true ){
- try {
- Thread.sleep(10 );
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- outputer.output("lihuoming" );
- }
- }
- }).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();
- }finally {
- lock.unlock();
- }
- }
- public synchronized void output2(String name){
- int len = name.length();
- for ( int i= 0 ;i<len;i++){
- System.out.print(name.charAt(i));
- }
- System.out.println();
- }
- public static synchronized void output3(String name){
- int len = name.length();
- for ( int i= 0 ;i<len;i++){
- System.out.print(name.charAt(i));
- }
- System.out.println();
- }
- }
- }
2.读写锁:ReadWriteLock
[java]
view plain
copy
- import java.util.Random;
- import java.util.concurrent.locks.ReadWriteLock;
- import java.util.concurrent.locks.ReentrantReadWriteLock;
- public class ReadWriteLockTest {
- public static void main(String[] args) {
- final Queue3 q3 = new Queue3();
- for ( int i= 0 ;i< 3 ;i++)
- {
- new Thread(){
- public void run(){
- while ( true ){
- q3.get();
- }
- }
- }.start();
- new Thread(){
- public void run(){
- while ( true ){
- q3.put(new Random().nextInt( 10000 ));
- }
- }
- }.start();
- }
- }
- }
- class Queue3{
- private Object data = null ; //共享数据,只能有一个线程能写该数据,但可以有多个线程同时读该数据。
- ReadWriteLock rwl = new ReentrantReadWriteLock();
- public void get(){
- rwl.readLock().lock();
- try {
- System.out.println(Thread.currentThread().getName() + " be ready to read data!" );
- Thread.sleep((long )(Math.random()* 1000 ));
- System.out.println(Thread.currentThread().getName() + "have read data :" + data);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }finally {
- rwl.readLock().unlock();
- }
- }
- public void put(Object data){
- rwl.writeLock().lock();
- try {
- System.out.println(Thread.currentThread().getName() + " be ready to write data!" );
- Thread.sleep((long )(Math.random()* 1000 ));
- this .data = data;
- System.out.println(Thread.currentThread().getName() + " have write data: " + data);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }finally {
- rwl.writeLock().unlock();
- }
- }
- }
3.用读写锁实现一个简单缓存机制
[java]
view plain
copy
- import java.util.HashMap;
- import java.util.Map;
- import java.util.concurrent.locks.ReadWriteLock;
- import java.util.concurrent.locks.ReentrantReadWriteLock;
- public class CacheDemo {
- private Map<String, Object> cache = new HashMap<String, Object>();
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- }
- private ReadWriteLock rwl = new ReentrantReadWriteLock();
- public Object getData(String key){
- rwl.readLock().lock();
- Object value = null ;
- try {
- value = cache.get(key);
- if (value == null ){
- rwl.readLock().unlock();
- rwl.writeLock().lock();
- try {
- if (value== null ){
- value = "aaaa" ; //实际失去queryDB();
- }
- }finally {
- rwl.writeLock().unlock();
- }
- rwl.readLock().lock();
- }
- }finally {
- rwl.readLock().unlock();
- }
- return value;
- }
-
}
发表评论
-
ReentrantLock与synchronized的区别
2012-10-22 13:33 520ReentrantLock 的lock机制有2种,忽略中断 ... -
java的concurrent/java.util.concurrent.locks用法详解
2012-10-19 15:49 720java.util.concurrent.locks - ... -
java.util.concurrent详解(四) BlockingQueue
2012-10-19 10:00 7597.BlockingQueue “支持两个附加操作 ... -
java.util.concurrent详解(三)ScheduledThreadPoolExecutor
2012-10-18 14:32 8296. ScheduledThreadPoolExecutor ... -
java.util.concurrent详解(二)Semaphore/FutureTask/Exchanger
2012-10-18 14:31 968------------------------------- ... -
java.util.concurrent详解(一) Latch/Barrier
2012-10-18 14:30 1021Java1.5提供了一个非常高效实用的多线程包:java.ut ... -
浅析Java中CountDownLatch用法
2012-10-16 18:09 8CountDownLatch如其所写,是一个倒计数的锁存器,当 ... -
Java轻量级锁原理详解(Lightweight Locking)
2012-10-11 18:06 797大家知道,Java的多线程 ... -
深入理解DCL(双检锁)的安全性
2012-10-11 18:07 948对于双检锁,其实有多种不同的用法,有很多种用法是无论如何不会出 ... -
Java偏向锁实现原理(Biased Locking)
2012-10-11 18:08 745阅读本文的读者,需要对Java轻量级锁有一定的了解,知道loc ... -
多线程下race condition问题
2012-10-11 18:07 1413这个问题的讨论来自内部的一个关于“多线程环境下使用Hashma ...
相关推荐
Java的多线程编程中,读写锁(ReadWriteLock)是一种高效的并发控制机制,它将锁的权限进行了区分,允许多个线程同时读取资源,但仅允许一个线程进行写入操作。这种设计模式提高了数据共享的效率,因为读操作通常...
Java 读写锁是Java并发编程中的一种重要机制,它为多线程环境下的数据访问提供了更为精细的控制。在Java的`java.util....通过阅读和分析`readwritelock`这个示例,开发者可以更好地掌握如何在Java中使用读写锁。
在这个项目中,`ReadWriteLock.cpp` 和 `ReadWriteLock.h` 文件分别包含了读写锁的实现和接口定义。 读写锁的核心概念是允许多个读取者同时访问资源,但当有写入者时,会独占资源,防止数据不一致。这种机制适用于...
使用 ForkJoinPool 进行分叉和合并,锁 Lock,读写锁 ReadWriteLock 原子性长整型 AtomicLong,原子性引用型 AtomicReference 修改数据: 一 服务端修改数据: 一 文章知识点与官方知识档案匹配,可进一步学习相关...
在没有`ReadWriteLock`的情况下,可以通过`synchronized`关键字和一些额外的逻辑控制来实现读写锁的功能。文章中的示例代码展示了这一过程。主要思路是将业务逻辑封装在一个名为`Business`的类中,该类包含了一个...
《Java并发编程学习宝典(漫画版)》中提到的23章主要讲解了Java并发编程中的一个重要概念——ReadWriteLock,即读写锁。ReadWriteLock是`java.util.concurrent.locks`包下的一个接口,它是对传统互斥锁的一个扩展,...
- `ReadWriteLock`接口:这是读写锁的接口,扩展了基础锁的概念,提供了创建读锁和写锁的方法,以及获取当前读写状态的统计信息。它还包含两个工厂方法,用于创建读写锁实例,可以指定是否优先满足写入需求。 2. *...
- **缓存系统**:读写锁可以在缓存系统中发挥重要作用,允许多个线程同时查询缓存,但只允许一个线程更新缓存。 ### 三、StampLock详解 #### 3.1 StampLock简介 `StampLock`是Java 8引入的一种新的同步机制,它...
- **读写锁**: 除了ReentrantLock,Java还提供了ReadWriteLock接口,它包含两个Lock对象:一个用于读操作(ReadLock),允许多个线程同时读取共享资源;另一个用于写操作(WriteLock),一次只允许一个线程写入。...
1. java.util.concurrent - Java 并发工具包 ...21. 读写锁 ReadWriteLock 22. 原子性布尔 AtomicBoolean 23. 原子性整型 AtomicInteger 24. 原子性长整型 AtomicLong 25. 原子性引用型 AtomicReference
1. java.util.concurrent - Java 并发工具包 ...21. 读写锁 ReadWriteLock 22. 原子性布尔 AtomicBoolean 23. 原子性整型 AtomicInteger 24. 原子性长整型 AtomicLong 25. 原子性引用型 AtomicReference
java_util_concurrent_user_guide_cn.pdf 内容预览: 1.... 读写锁 ReadWriteLock 22. 原子性布尔 AtomicBoolean 23. 原子性整型 AtomicInteger 24. 原子性长整型 AtomicLong 25. 原子性引用型 AtomicReferenc
在Java中,读写锁是通过ReadWriteLock接口实现的,该接口提供了readLock和writeLock两种锁的操作机制,一个资源可以被多个线程同时读,或者被一个线程写,但是不能同时存在读和写线程。 读写锁的基本规则是: * 读...
- 数据库连接池、缓存系统等都是读写锁的经典应用场景。 6. **最佳实践**: - 获取锁时应尽可能选择读锁,除非需要修改共享资源。 - 使用完锁后,记得及时释放,避免死锁的发生。 - 注意锁的公平性和非公平性...
Java线程之锁对象Lock-同步问题更完美的处理...* Lock对象可以用来实现读写锁(ReadWriteLock),提高系统的并发性和性能。 * 读写锁可以提高系统的性能和并发性,但是需要谨慎使用,以免出现死锁或其他线程同步问题。
局部变量 rwLock, ReadWriteLock ' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、...
- 除了Lock接口,Java还提供了读写锁(ReadWriteLock)接口,其主要实现类是ReentrantReadWriteLock。读写锁允许多个读线程同时访问共享资源,但在写操作时会独占资源,提高了并发性能。 - `ReadLock`和`WriteLock...
C 语言中的可移植读写锁该项目旨在为 C 创建一个易于使用且可移植的读写锁。这是通过使用 POSIX 信号量和“隐藏”结构声明来实现的,以避免滥用提供的 API。 这个锁是reader-preferred ,这意味着一个 writer 必须...