你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它?
时间:2022-07-22
本文章向大家介绍你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它?,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Lock读写锁机制可以实现!
在Java中Lock接口比synchronized块的优势是什么?
Lock接口最大的优势是为读和写分别提供了锁。
1 import java.text.SimpleDateFormat;
2 import java.util.Date;
3 import java.util.Random;
4 import java.util.concurrent.locks.ReadWriteLock;
5 import java.util.concurrent.locks.ReentrantReadWriteLock;
6
7
8
9
10 public class JoinTest2 {
11
12 public static void main(String[] args) {
13 final TheData theData = new TheData();
14 for(int i=0;i<4;i++){
15 new Thread(new Runnable() {
16 @Override
17 public void run() {
18 theData.get();
19 }
20 }).start();
21 }
22 for(int i=0;i<4;i++){
23 new Thread(new Runnable() {
24 @Override
25 public void run() {
26 theData.put(new Random().nextInt(1000));
27 }
28 }).start();
29 }
30 }
31
32
33 }
34
35 class TheData{
36 private Integer data = 0;
37 private ReadWriteLock rwLock = new ReentrantReadWriteLock();
38 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
39 public void get(){
40 rwLock.readLock().lock();//读锁开启,读进程均可进入
41 try{//用try finally来防止因异常而造成的死锁
42 System.out.println(Thread.currentThread().getName()+"read lock is ready.."+sdf.format(new Date()));
43 Thread.sleep(1000);
44 System.out.println(Thread.currentThread().getName()+"read data is"+data);
45 }catch (InterruptedException e) {
46 e.printStackTrace();
47 }finally{
48 rwLock.readLock().unlock();//读锁解锁
49 }
50 }
51
52 public void put(Integer data){
53 rwLock.writeLock().lock();//写锁开启,这时只有一个写线程进入
54 try{//用try finally来防止因异常而造成的死锁
55 System.out.println(Thread.currentThread().getName()+"write lock is ready.."+sdf.format(new Date()));
56 Thread.sleep(1000);
57 this.data = data;
58 System.out.println(Thread.currentThread().getName()+"write data is"+data);
59
60 }catch (InterruptedException e) {
61 e.printStackTrace();
62 }finally{
63 rwLock.writeLock().unlock();//写锁解锁
64 }
65 }
66 }
运行结果如下:
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法