利用读写锁写一个缓存系统
01.import java.util.HashMap;
02.import java.util.Map;
03.import java.util.concurrent.locks.ReadWriteLock;
04.import java.util.concurrent.locks.ReentrantReadWriteLock;
05.
06./**
07. * 利用读写锁写一个缓存系统
08. * @author 谭飞
09. * @date 2012-02-03
10. */
11.public class CacheDemo {
12.
13. private Map<String, Object> cache = new HashMap<String, Object>(); //用于存放缓存的数据集
14.
15. /**
16. * @param args
17. */
18. public static void main(String[] args) {
19. CacheDemo demo = new CacheDemo();
20. //demo.cache.put("3", 123456);
21. System.out.println("返回的值:" + demo.getCache2("3"));
22. }
23.
24. /*利用synchronized同步,但是有缺陷,当是很多线程读取数据时不应该用,
25. * 因为这样会降低效率,最好用读写锁来控制*/
26. public synchronized Object getCache1(String key)
27. {
28. Object value = null;
29. value = cache.get(key);
30. if(value == null)
31. {
32. //查询数据操作 此处省略
33. value = "数据库取得的值";
34. }
35. return value;
36. }
37.
38. private ReadWriteLock rwl = new ReentrantReadWriteLock();//创建读写锁
39.
40. /*利用读写锁来控制多个线程的读写操作*/
41. public Object getCache2(String key)
42. {
43. rwl.readLock().lock();//打开读锁
44. Object value = null;
45. try
46. {
47. value = cache.get(key);
48. if(value == null)
49. {
50. rwl.readLock().unlock();//关闭读锁
51. rwl.writeLock().lock();//打开写锁
52. try
53. {
54. if(value == null)//再次检测该值是否为null,因为在多个线程访问的时候,写数据的时候会把其它写的线程堵在外面,一旦写完后,这个value存在值了就不用再去查询数据库了,以此来提高系统的效率
55. {
56. //查询数据操作 此处省略
57. value = "数据库取得的值";
58. }
59. }finally
60. {
61. rwl.writeLock().unlock();//关闭写锁
62. }
63. rwl.readLock().lock();//打开读锁
64. }
65. }finally
66. {
67. rwl.readLock().unlock();//关闭读锁
68. }
69. return value;
70. }
71.
72.}
分享到:
相关推荐
本文将深入探讨基于Zookeeper实现的分布式读写锁,并利用Zkclient客户端进行操作。Zookeeper是一个分布式服务协调框架,它提供了一种简单且高效的方式来实现分布式锁。 **一、Zookeeper简介** Zookeeper是由Apache...
"利用读写锁保持线程同步"这个主题聚焦于一种特定的并发控制机制,即读写锁,它在多线程程序中用于优化数据共享,提高并发性能。读写锁允许多个线程同时读取数据,但当有线程写入时,所有其他线程(无论是读取还是...
在计算机科学中,特别是操作系统和并发编程领域,读写锁允许多个线程同时读取数据,但只允许一个线程写入数据,以此来实现高效的数据访问。这种锁机制的设计目的是在保证数据一致性的同时,最大化资源利用率,尤其是...
在Windows系统中,我们可以使用`SRWLock`(Slim Reader/Writer Lock)API,这是一个轻量级的读写锁实现。`SRWLock`提供了`AcquireReader`、`AcquireWriter`、`ReleaseReader`和`ReleaseWriter`等函数,用于获取和...
- **缓存系统**:读写锁可以在缓存系统中发挥重要作用,允许多个线程同时查询缓存,但只允许一个线程更新缓存。 ### 三、StampLock详解 #### 3.1 StampLock简介 `StampLock`是Java 8引入的一种新的同步机制,它...
6. 性能优化:为了处理大量并发请求,系统可能需要进行性能优化,如使用缓存减少数据库访问,通过负载均衡分散服务器压力,以及利用异步处理提高响应速度。 7. 日志记录:系统应记录所有投票活动,以便追踪和审计。...
《易语言SRWLock读写锁模块源码详解》 在计算机编程中,多线程同步是不可或缺的一部分,其中读写锁(SRWLock,即Slim Read-Write Lock)是一种高效的线程同步机制,尤其在高并发场景下,能够显著提升程序性能。...
其次,缓存的大小也是一个关键因素。缓存容量过小可能导致频繁的替换操作,而缓存过大则可能浪费资源。因此,合理地调整缓存容量以适应不同的应用场景和数据访问模式至关重要。 在实现过程中,还需要考虑多线程并发...
缓存数据一致性是指缓存系统与数据源之间保持数据的同步与一致性。在实际应用中,这通常很难实现,因为需要同时考虑性能和一致性的问题。为保证一致性,可能需要采用一些策略,如: - 缓存数据时,设置合适的过期...
易语言是一种基于中文编程的计算机程序...通过对这份源码的学习,开发者可以深入了解易语言的多线程编程,以及如何有效地利用读写锁来优化并发性能。这种实践经验对于提升编程技能和解决实际问题的能力是非常有价值的。
在这个多读单写锁演示程序中,开发者可能通过创建和管理读写锁对象,模拟了不同线程对共享资源的读写操作,展示了如何在Windows环境下有效利用读写锁来实现线程同步,提高并发性能。通过学习和理解这个程序,你可以...
为了模拟EEPROM,可以利用Flash的一个特定区域,通过软件实现数据的写入、读取和擦除逻辑,这样可以在不影响程序运行的前提下,实现类似EEPROM的非易失性存储。 5. **串口指令封装**:在给定的例程中,串口指令被...
"E驱动 内存读写源码" 提供的可能是一个用于学习或实践的内存管理驱动程序代码,让我们深入探讨这个主题。 内存驱动程序,通常是指在操作系统内核层运行的代码,它们负责管理和控制系统的物理和虚拟内存。在Windows...
“基于键值对缓存的数据读写装置”可能是一个硬件设备或软件组件,设计用于实现上述方法,提升数据读写性能。这样的装置可能包含专用的硬件加速器或者优化的软件算法,以适应特定应用场景的需求。 总结来说,这个...
`fcntl()`可以设置读写锁,当一个进程拥有写锁时,其他进程不能读写;拥有读锁时,其他进程可以读但不能写。在实验中,生产者和消费者进程使用文件锁来控制对FIFO文件的访问,保证了数据的正确传递和处理。 通过这...
Redis作为一个键值对数据库,因其高效读写性能和丰富的数据结构(如字符串、哈希、列表、集合、有序集合)而常用于缓存。在SpringBoot应用中,我们可以利用Spring Data Redis模块轻松地与Redis进行交互。首先,需要...
例如,在多用户环境下,数据库管理系统需要处理多个并发的读写请求,通过锁、事务等机制保证数据一致性;在大数据处理中,分布式存储系统如Hadoop HDFS利用并行化读写提高整体性能。 总结来说,"行业分类-设备装置-...
在本文中,我们将深入探讨如何实现对STM32L151C8T6微控制器上的Flash存储进行读写操作。STM32L151C8T6是一款基于ARM ...在实际应用中,还需考虑电源管理、异常处理和性能优化等因素,以充分利用这一强大的微控制器。
在Java Web环境中,如JSP(JavaServer Pages)中,我们可以创建一个简单的计数器类,该类将数据持久化到文件中,每次有请求时增加计数值,然后保存回文件。 实现计数器的流程大致如下: 1. **初始化计数器**:当...
标题中的“行业分类-设备装置-一种数据库的读写方法及系统”暗示了这是一个关于数据库技术在设备装置行业的应用,具体涉及数据存取策略和架构。描述中的信息与标题一致,再次确认了主题是数据库的读写操作及其相关...