自定义同步器

自定义同步器

  • 假如你想要实现一个自定义同步器,官方推荐的做法是将继承了AQS类的子类作为自定义同步器的内部类,而自定义同步器中相关的操作只需代理成子类中对应的方法即可。往下用一个简单的例子看看如何实现自己的锁,由于同步器被分为两种模式,独占模式和共享模式,所以例子也对应给出。

独占式

  • 独占模式采取的例子是银行服务窗口,假如某个银行网点只有一个服务窗口,那么此银行服务窗口只能同时服务一个人,其他人必须排队等待。所以这种银行窗口对应的同步器是独占模型。我们先定义一个银行窗口同步器类,它按照官方推荐的做法使用一个继承AQS同步器的子类实现,该子类且为内部类。然后重写tryAcquire和tryRelease方法,获得锁与释放锁的操作主要就是维护同步状态变量,该变量只能为0或1。此外,还提供了handle和unhandle两个方法供使用,其实就是间接调用自定义同步器。

9417315b31ec44e8bf9205702db45670
  • 接着我们定义一个测试类,形象一点来说的话就是有三位良民到银行去办理业务。他们分别是tom、jim和jay,现在我们使用BankServiceWindow同步器就可以约束他们排队,一个一个轮着来办理业务从而避免陷入混乱的局面。
  • bf54d8a2adcb4ad5ab829c241f8e712e
  • 最终输出结果如下,明显tom、jim、jay仨人是排队完成的。但我们是没办法保证三者的顺序的,可能是tom、jim、jay,也可能是tom、jay、jim,因为在入列以前的执行先后是无法确定的。这个同步器的语义是保证一个接一个办理。

tom开始办理业务
tom结束办理业务
jim开始办理业务
jim结束办理业务
jay开始办理业务
jay结束办理业务

共享模式

  • 共享模式采取的例子同样是银行服务窗口,随着银行网点的发展,办理业务的人越来越多,一个服务窗口已经无法满足需求。于是分配了另外一位员工开了另外一个服务窗口,这时就可以同时服务两个人了。但两个窗口都有人占用时同样也必须排队等待,这种多个服务窗口的同步器就是共享模式。我们先定义共享模式的同步器类,与独占模式不同的是它的状态的初始值可以自由定义,有多少个窗口就设为多少,获取与释放就是对状态递减和累加操作。需要重写AQS类的tryAcquireShared和tryReleaseShared方法,
  • 12dda835c51f4960b4a67591b7cece8c
  • 接着定义一个测试类,tom、jim和jay再次来到银行,现在因为有两个窗口所以他们可以两个人同时办理,时间缩减了不少。现在我们使用BankServiceWindowShared同步器就可以同时给两个人办理。
  • a54c94b2f0be4c6fb3abb55af23af5ec
  • 可能的输出结果如下。tom和jay几乎同时开始办理业务,而当jay结束后一有空闲的服务窗口jim就马上过去办理业务。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
精易模块V7.6.5 what's new:(20191001) 一、新增 1、新增“剪贴板_监听”,把指定的窗口句柄加入到剪贴板查看器链中; 2、新增“剪贴板_停止监听”,从剪贴板查看器链中删除指定的窗口句柄; 3、新增“进度条_滚动”,设置成功返回1,失败返回0。需要使用Windows通用组件库。感谢【@aqwvwv 】提供; 4、新增“时间_判断二十四节气”,判断日期范围为1901年1月1日—2099年12月31日以内的指定日期是否为节气日,是返回节气名称,不是返回空;感谢【@yhywhh123 】提供; 5、新增“系统_重启资源管理器”,成功重启资源管理器; 6、新增“外部组合框_取结构信息”,成功返回组合框的结构信息; 7、新增“进程_终止进程”,一个或多个任务进程结束; 8、新增“窗口_端口取PID”,通过本地端口取出进程PID;感谢【@DeHby 】提供; 9、新增“窗口_注册窗口热键”,注册窗口级热键,只有在窗口被激活时才有效; 10、新增“窗口_撤销窗口热键”,撤销窗口级热键; 二、修复 1、修复“时间_取北京时间”“时间_同步校时”多了八个小时,原因是“时间_GMT转为时间”已有处理东八区该加上的八个小时; 2、修复“文本_是否为汉字2”,返回值错误的问题!感谢【@linqing4 】反馈问题; 3、修复“系统_生成随机mac”,没判断16进制中第一组第二个数字必须是偶数;感谢【@韦贝贝 】反馈建议; 4、修复“类_配置项ex - 读”,传参的默认文本不做解密处理; 5、修复“网页_Cookie合并更新”,当Cookie值有空格时返回却没有空格的问题;感谢【@默念、 】反馈问题; 6、修复“网页_访问_对象”代理方法的问题;感谢【@wg521125 】反馈问题; 7、修复“普通填表 - 组合框_操作”,枚举对象的问题; 8、修复“文本_取全部汉字拼音”,保留非汉字为真时欲转换的文本结尾不为汉字返回少一个字符的问题;感谢【@寒潮 】反馈问题; 三、优化 1、优化“类_json - 置属性”,不为对象时自动转义反斜杠和引号以及换行符,同时支持数字名字的赋值,需要加声明; 2、优化“类_日志输出 - 文件路径”,当文件句柄大于0时执行关闭文件命令;感谢【@shituo 】反馈建议; 3、优化“外部组合框_置现行选中项”,增加通知父窗选择了组合框中的一项; 4、优化“键盘_键名取键代码”,增加取Tab键键值;感谢【@y10455 】反馈问题; 5、优化“键盘_键代码取键名”,增加Tab键值取键名; 四、移除 1、移除“PathAddBackslashA”,滥用此功能可能导致缓冲区溢出; 2、移除“SendMessageA_Rect”、“SendMessageA_逻辑”、“SendMessageA_文本”、“SendMessageA_整数”,统一使用“SendMessageA”; 3、移除“CallWindowProcA_指针”,统一使用“CallWindowProcA”; 4、移除“lstrlenA_文本”、“lstrlenA_整数”,统一使用“lstrlenA”; 5、移除“PostMessageA_str”,统一使用“PostMessageA”; 6、移除“send_文本”、“send_整数”、“send_字节集”,统一使用“send”; 7、移除“SetClassLongA1”,统一使用“SetClassLongA”; 8、移除“SetWindowLongA_指针”、“SetWindowLongA_子程序指针”,统一使用“SetWindowLongA”; 9、移除“WideCharToMultiByte_整数”、“WideCharToMultiByte_字节集”,统一使用“WideCharToMultiByte”; 10、移除“HttpSendRequestA_字节集”,统一使用“HttpSendRequestA”; 11、移除“FindWindowExA_文本”,“FindWindowExA_整数”,统一使用“FindWindowExA”; 12、移除“文本_取地址”、“取变量数据地址_文本”,统一使用“取指针文本_”; 13、移除“变量_取数据指针”,统一使用“取数据_通用型”; 14、移除“指针_到整数型_汇编”,统一使用“指针_到整数”; 15、移除“取整数型引用”、“取整数型指针”,统一使用“取指针整数_”; 16、移除“取指针地址_通用”,统一使用“取指针_通用型”; 17、移除“取指针地址_数组通用”,统一使用“取指针_通用型_数组”; 18、移除“取变量数据地址_字节集”,统一使用“取指针字节集_”; 精易模块V7.6.0 what's new:(20190902) 一、新增 1、新增“文本_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值