标签:

一直对多线程有恐惧,在实现共享锁和排它锁之后,感觉好了很多。

共享锁    就是查询的时候,如果没有修改,可以支持多线程查询;

排它锁    就是修改的时候,锁定共享锁,停止查询,同时,锁定排它锁,只允许一个线程进行修改,修改完成后,再解开共享锁;

心路历程: 一开始的想法是,绝对不调用 sleep ,要用到sleep 的地方我觉得都可以用  notify() 和 wait() 替换,sleep(T) 我觉得T  的大小压根是无法算出来的,如果非要用sleep 我觉得T 的时间应该是一个动态的值,这个值是通过函数的执行时间的一个平均值(每N次执行算一个 平均值出来) 但个人觉得还是不如notify() 和wait(); 我为了简单,操作的是一颗字典树代替B树;如何实现读支持多线程,写单线程呢! 当各种查询和修改的操作以多线程的方式提交给线程池的时候,程序会从阻塞队列里面不断的取任务,当前面取到的任务是 查询的时候,不要管他,没有修改表结构,直接丢给一个线程,当取到的下任务是一个修改或者更新的任务时,首先必须等待前面的查询全部查询完,然后再停掉阻塞队列不断的添加任务, 要让我修改完成之后,再唤醒阻塞队列添加任务;由于我不知道如何停掉线程池的阻塞队列添加任务,所以干脆自己模拟线程池这个过程;(理论上这个方法是可行的) 主要的卡是在notify() 和 wait()的理解上面,这两个方法执行时都必须在 锁里面; 所以在查询的代码里面,你不能wait() 那样会变成单线程;

1 insert; 2 remove;  3 query; -1 stopRun

1 packagecom.trafree;2

3 importjava.io.File;4 importjava.io.IOException;5 import java.util.*;6 importjava.util.concurrent.atomic.AtomicInteger;7

8 /**

9 * Created by on_the_way on 2014/12/31.10 */

11 public classAboutThread {12

13 public static booleaninsert(String str) {14 int len =str.length();15 Trie p =root;16 for (int i = 0; i < len; i++) {17 int num = str.charAt(i) - ‘a‘;18 if (p.next[num] == null) {19 p.next[num] = newTrie();20 }21 p =p.next[num];22 }23 if (p.end) return false;24 return p.end = true;25 }26

27 public static booleanremove(String str) {28 int len =str.length();29 Trie p =root;30 for (int i = 0; i < len; i++) {31 int num = str.charAt(i) - ‘a‘;32 if (p.next[num] == null) {33 return false;34 }35 p =p.next[num];36 }37 if (!p.end) {38 return false;39 }40 p.end = false;41 return true;42 }43

44 public static booleanquery(String str) {45 int len =str.length();46 Trie p =root;47 for (int i = 0; i < len; i++) {48 int num = str.charAt(i) - ‘a‘;49 if (p.next[num] == null) {50 return false;51 }52 p =p.next[num];53 }54 returnp.end;55 }56

57 public static Trie root = newTrie();58

59 public static classTrie {60 public Trie next[] = new Trie[26];61 public booleanend;62

63 publicTrie() {64 for (int i = 0; i < 26; i++) {65 this.next[i] = null;66 }67 this.end = false;68 }69 }70

71 public static class Consumer implementsRunnable {72 public voidrun() {73 try{74 MyThread.process();75 } catch(Exception e) {76 e.printStackTrace();77 }78 }79 }80

81 public static class MyThread implementsRunnable {82

83 public intsequence;84 public intaction;85 publicString str;86 public booleanres;87

88 public static Object lock1 = newObject();89 public static Object lock2 = newObject();90 public static Object lock3 = newObject();91

92 public static boolean needNotify1 = false;93 public static boolean needNotify2 = false;94 public static boolean needNotify3 = false;95 public static boolean runModify = false;96

97 public static AtomicInteger queryNum = new AtomicInteger(0);98 public static Queue pool = new LinkedList();99

100 public MyThread(int sequence, intaction, String str) {101 this.sequence =sequence;102 this.action =action;103 this.str =str;104 this.res = false;105 }106

107 public static void process() throwsInterruptedException {108

109 boolean needBreak = false;110 while (true) {111 if( pool.size() == 0 &&needBreak ){112 break;113 }114 synchronized(lock1) {115 if (pool.size() == 0) {116 needNotify1 = true;117 lock1.wait();118 }119 }120 synchronized(lock3) {121 if(runModify) {122 needNotify3 = true;123 lock3.wait();124 }125 }126 MyThread myThread =pool.poll();127

128 if (myThread.action == -1){129 needBreak = true;continue;130 }131 if (myThread.action == 1 || myThread.action == 2) {132 synchronized(lock2) {133 if (queryNum.get() != 0) {134 needNotify2 = true;135 runModify = true;136 lock2.wait();137 newThread(myThread).start();138 } else{139 runModify = true;140 newThread(myThread).start();141 }142 }143 } else{144 queryNum.incrementAndGet();145 newThread(myThread).start();146 }147 }148 }149

150 public voidrun() {151 if (this.action == 1) {152 this.res = insert(this.str);153 synchronized(lock3) {154 needNotify1 = false;155 runModify = false;156 if( needNotify3 )lock3.notify();157 }158 System.out.println(sequence+" "+action+" "+str+" "+res);159 } else if (this.action == 2) {160 this.res = remove(this.str);161 synchronized(lock3) {162 needNotify1 = false;163 runModify = false;164 if( needNotify3 )lock3.notify();165 }166 System.out.println(sequence+" "+action+" " + str+" "+res);167 } else{168 this.res =query(str);169 System.out.println(sequence+" "+action+" "+str+" "+res);170 synchronized(lock2) {171 if (queryNum.decrementAndGet() == 0) {172 if(needNotify2)lock2.notify();173 }174 }175 }176 }177

178 }179

180 public static void main(String arg[]) throwsIOException {181

182 File file = new File("F:" + File.separator + "in.txt");183 Scanner cin = newScanner(file);184 int N =cin.nextInt();185 int M =cin.nextInt();186

187 for (int i = 0; i < N; i++) {188 insert(cin.next());189 }190

191 new Thread(newConsumer()).start();192 for (int i = 0; i < M; i++) {193 MyThread myThread = newMyThread(i, cin.nextInt(), cin.next());194 synchronized(MyThread.lock1) {195 MyThread.pool.add(myThread);196 if(MyThread.needNotify1) {197 MyThread.needNotify1 = false;198 MyThread.lock1.notify();199 }200 }201 }202 }203 }

View Code

40 45

what

make

you

so

beautiful

have

think

cell

green

red

java

hand

forum

discuss

online

contests

teaching

exercise

contest

recent

icpc

authors

ranklist

problem

achive

exams

university

judge

register

new

fortunately

old

behind

locked

the

feature

find

by

alphabet

more

3 what

3 more

3 old

3 find

3 exams

3 achive

3 icpc

3 recent

3 ranklist

2 ranklist

3 ranklist

1 ranklist

3 ranklist

3 find

3 alphabet

2 find

2 find

3 find

2 alphabet

1 alphabet

3 alphabet

3 find

1 find

3 find

3 what

3 more

3 old

3 find

3 exams

3 achive

3 icpc

3 recent

3 ranklist

3 ranklist

3 what

3 more

3 old

3 find

3 exams

3 achive

3 icpc

3 recent

3 ranklist

3 ranklist

-1 end

标签:

java共享锁排它锁_java 实现共享锁和排它锁相关推荐

  1. 详解共享锁(S锁)和排它锁(X锁)

    1. 概念 共享锁[S锁] 又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁.这保证了其他事务可以读A,但在T释放A上 ...

  2. java 共享锁_Java锁--共享锁和ReentrantReadWriteLock

    ReadWriteLock 和 ReentrantReadWriteLock介绍 ReadWriteLock,顾名思义,是读写锁.它维护了一对相关的锁 - - "读取锁"和&quo ...

  3. Java锁深入理解5——共享锁

    前言 本篇博客是<Java锁深入理解>系列博客的第五篇,建议依次阅读. 各篇博客链接如下: Java锁深入理解1--概述及总结 Java锁深入理解2--ReentrantLock Java ...

  4. 用java的io做一个代码计数器,如何制作Java页面计数器_java

    大庆采油六厂采油工艺研究所 王兵 王波 常常逛WWW的人,一定对许多起始页上的计数器感兴趣.每当你光临某个站点的起始页时,它的计数器就很亲切地告诉你,从某年某月某日开始,你是第几位光临的人.你可能也想 ...

  5. 【源码+图片素材+详细教程】Java游戏开发_Java开发经典游戏飞翔的小鸟_飞扬的小鸟_Java游戏项目Flappy Bird像素鸟游戏_Java课程设计项目

    课程目标: 1.通过本课程的学习巩固Java的相关基础知识,例如循环判断,数组和集合的使用,对象的继承,接口的实现,窗口的创建,事件监听,图形绘制. 2.完成小鸟的移动,管道自动生成.碰撞死亡,计分系 ...

  6. 【源码+教程】Java桌球游戏_Java初级项目_Java练手项目_Java项目实战_Java游戏开发

    今天分享的Java开源游戏项目是桌球游戏,初学者也可以用来练习喔~课程详细讲解了一个桌球游戏的编写思路和流程,即使你刚学Java没多久,也可以跟随该教程视频完成属于你自己的桌球游戏!同时,还可以加深和 ...

  7. 【源码+项目部署】Java课程设计项目_Java人力资源管理系统

    对就业和毕业都有帮助的Java实战项目来咯--人力资源管理系统! 人力资源管理系统 |Java项目2小时上手编写_源码+数据库拿走不谢!Java实战项目_Java开发https://www.bilib ...

  8. 共享锁(S锁)和排它锁(X锁)

    共享锁[S锁] 又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁.这保证了其他事务可以读A,但在T释放A上的S锁之前不 ...

  9. java并发排它锁_Java并发编程进阶——锁(解析)

    一.锁是什么 java开发中进行并发编程时针对操作同一块区域时,如果不加锁会出现并发问题,数据不是自己预计得到的值.我觉得有点像mysql事务中脏读.不可重复读.幻读的问题.加锁的目的是为了保证同一时 ...

最新文章

  1. android binder机制之——(创建binder服务)
  2. 计算机组成原理二进制地址码,计算机组成原理
  3. uglifyjs报错 webpack_webpack3里使用uglifyjs压缩js时打包报错的解决
  4. 计算机网络学习笔记-1.2.2OSI参考模型(1)
  5. 刚刚,SeetaFace版本升级!新增活体检测等功能
  6. java string的某个字符_JAVA如何提取String中字符串的某个字符 具体内容
  7. oppoa1计算机记录删了怎么办,捡到oppoA1怎么解锁
  8. artDialog双击会关闭对话框的修改
  9. foobar 2000 介绍
  10. C++中10的N次方如何表示
  11. HRA系列DC-DC隔离电源模块接线注意事项
  12. captain and crew
  13. excel模板报表转PDF下载
  14. 修复图片移入移出抖动错位bug
  15. “落子无悔,抉择本身就是向前”——2022年度总结
  16. 牛商视播系统是什么来的?
  17. deepin外置键盘无法打开键盘背光灯的解决方法
  18. python抓包检测入侵_如果你喜欢python爬虫,不妨看看这篇验证码的抓包技巧与识别!...
  19. ardupilot相机拍照控制
  20. W25qxxx 实现文件系统 ---- 基于RT-thread嵌入式操作系统

热门文章

  1. Hadoop学习总结:Map-Reduce入门
  2. 机房线路故障,引发多家公司不能上网,和自己de经历有感
  3. tcount在哪个文件里_办公软件技巧:一键获取文件名称
  4. matlab1分钟数据转5分钟,把股票的5分钟k线数据转换成matlab的day文件
  5. android 动态设置textview的边距,添加边距为动态的Android的TextView(Adding Margins to a dynam...
  6. 01迷宫(洛谷-P1141)
  7. 信息学奥赛C++语言: 跑步
  8. 15 WM配置-主数据-定义存储区标识符(Storage Section Indicators)
  9. 3 CO配置-企业结构-分配-把公司代码分配给成本控制范围
  10. C语言 strcat函数实现