本来想写一篇叫《由尝试Java synchronized锁所引发的一些关于代码结构的思考》的文章,涉及java的synchronized的机制本身(主要针对锁this和this.getClass()比较)、代码模块化和可读性的tradeoff、获取当前方法名以及调用方法名以及抽象类的实践四个部分。全部四个部分都是今天做synchronized学习试手时牵扯的问题,当然不全是今天刚开始考虑的,但是就趁机一起总结一下。

但是写文章和写代码一样,要是把内容都耦合在一起,虽然有连贯性,但是难免会感到冗长,主题不突出,回顾的时候也不是很好查找。于是乎,这篇长文决定拆四部分写,用超链接的方式进行互相关联。

文章《Java synchronized 详解》很清楚地说明了synchronized的使用和部分原理,仿照里面的代码,进行了练手。而这里我主要想讨论的,并非synchronized关键字本身,而是我在其代码基础上进行的改变

摘抄的代码

package com.zj.lock;import java.util.concurrent.TimeUnit;public class Resource1 {public void f() {// other operations should not be locked...System.out.println(Thread.currentThread().getName()+ ":not synchronized in f()");synchronized (this) {for (int i = 0; i < 5; i++) {System.out.println(Thread.currentThread().getName()+ ":synchronized in f()");try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}}}}public void g() {// other operations should not be locked...System.out.println(Thread.currentThread().getName()+ ":not synchronized in g()");synchronized (this) {for (int i = 0; i < 5; i++) {System.out.println(Thread.currentThread().getName()+ ":synchronized in g()");try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}}}}public void h() {// other operations should not be locked...System.out.println(Thread.currentThread().getName()+ ":not synchronized in h()");synchronized (this) {for (int i = 0; i < 5; i++) {System.out.println(Thread.currentThread().getName()+ ":synchronized in h()");try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}}}}public static void main(String[] args) {final Resource1 rs = new Resource1();new Thread() {public void run() {rs.f();}}.start();new Thread() {public void run() {rs.g();}}.start();rs.h();}
}

我仿制的代码:

package nationalholiday2017.trythread;import nationalholiday2017.util.print.JoePrint;import java.util.concurrent.TimeUnit;/*** Created by Joe Qiao on 2017/10/17.*/
public class TrySimpleLock {public static void main(String[] args) {final TrySimpleLock simpleLock = new TrySimpleLock();       new Thread(() -> simpleLock.f()).start();simpleLock.g();new Thread(() -> simpleLock.h()).start();}public void f() {combinedPrint();}public void g() {combinedPrint();}public void h() {combinedPrint();}public void loop() {for (int i = 0; i < 3; i++) {print(true);getSlower();}}private void synchronizedLoop() {synchronized (this) {loop();}}public void print(boolean flag) {String result;int threadOrder = 3;if (flag) {result = ": Positive in ";threadOrder += 2;} else {result = ": Negative in ";}JoePrint.print(Thread.currentThread().getName() + result + Thread.currentThread().getStackTrace()[threadOrder].getMethodName() + "()");}private void combinedPrint() {print(false);synchronizedLoop();print(false);}private void getSlower() {try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}
}

其实我写代码有点强迫症,见不得有重复的模块,一重复我就要把方法抽出来,无论是通过接口、静态工具类还是私有方法实现。但是这种代码写出来,被老师傅说可读性比较差,各种引用太复杂太乱。想来也有道理,毕竟代码不是一个人的,而且如果不通过注释,自己过一段时间可能同样会感到困惑。

但是这种明确答案的东西,既取决于个人的喜好,也受制于个人的理解能力,很难权衡,还是需要自己在以后的尝试中慢慢体会。

顺手提一句,代码中new Thread的时候用的jdk8 lambda特性也是刚刚开始尝试,因为没有什么深入认知和见解,就不深入讨论了。

还有获取当前/调用方法的

Thread.currentThread().getStackTrace()[threadOrder].getMethodName()

代码会在后面的文章说到

代码模块化和可读性的tradeoff相关推荐

  1. 单片机sleep函数的头文件_单片机代码模块化设计思想浅谈

    前言:前段时间分享的文章[单片机裸机代码框架设计思路],很多读者给我留言,觉得很不错,对于初学者而言,这是一个进阶的技巧,对于我而言,这是对自己总结和表达能力的一个提升. 本文章我们再谈谈单片机代码的 ...

  2. Java代码模块化-方法method

    Java代码模块化-方法method 1.method的概念 Java方法的目的:模块化.复用性.应用简单 2.结构 #mermaid-svg-WdGU5hKdhbgESetC .label{font ...

  3. 让别人和自己看懂自己的程序代码?一文掌握Java单行多行、文档注释以及注解(Annotation)超详细的理解使用,IDEA注释注解快捷键和模板,提高程序代码更有可读性

    文章目录 单行和多行注释 文档注释(Java特有) Annotation(注解)的理解 常见的Annotation示例 IDEA注释注解快捷键及模板 自定义 Annotation JDK 中的元注解 ...

  4. 基于Annoy的语义泛化-代码模块化

    以下为搜索的原始版本代码,该代码实现了基本的搜索测试,但未导出合理的接口,且当搜索词不在Annoy树中时会报错. # 基于annoy二叉树的近邻搜索版本import json import numpy ...

  5. 推荐几本提高Java代码规范、可读性、健壮性和可维护性的基本经典图

    一.背景 很多人不重视编码规范,不在意编程风格,不考虑代码的健壮性可维护性等. 很多人总有一种心态,就是我不读这些一样写代码,是的没错,是可以写! 但是更容易出各种bug,不知不觉会挖很多坑,团队合作 ...

  6. Js忍者秘籍-代码模块化

    1.模块化的好处 小的.组织良好的代码远比庞大的代码更容易理解和维护.优化程序结构和组织方式的一种方式是将代码拆分成小的.松散的片段或模块. 2.ES6之前的实现 2.1 模块模式 在E6之前,没有内 ...

  7. fekit前端代码模块化工具

    fekit是一套前端开发工具,是由去哪儿网开发.目前在github上开源.使用fekit的优点: a.本地开发支持环境:从开发调试到上线,均是前后端工程独立开发.调试.部署,打破了原来前后端揉在一个工 ...

  8. vba九九乘法表代码_VBA代码模块化--数据透视表

    本周工作中,用到了数据透视表的操作,这里汇总一下,学习途径来自网络,学习成果我也乐于分享一二~,代码整理为模块,供大家举一反三,可以套用. ① 创建数据透视表,及基本设置 先展示数据源和结果吧: 对应 ...

  9. java lint_提高你的代码稳定性与可读性-lint工具

    负责人:lingzideshensha 除了测试你的Android应用程序满足其功能需求,重要的是要确保你的代码没有结构性问题.代码结构简陋的可靠性和效率的影响你的Android应用程序,使您的代码很 ...

最新文章

  1. 既往出现中性粒细胞减少的患者可以重新应用依那西普
  2. 三代测序技术特点比较
  3. ASP.NET 2.0 X64的奇怪问题
  4. Forrester发表2010年度MSS市场分析报告
  5. 【C++】Visual Studio教程(一)-概述
  6. LVS(6)——NAT准备工作
  7. dateutils 工具类_五金工具泡壳封边机
  8. JavaScript的作用域详解
  9. python基于混合多项式模型PCF实现数据曲线拟合
  10. 城市轨道交通运营管理属于什么院系_青西新区高职校城市轨道交通运营与管理专业礼仪教学成果考核圆满结束...
  11. ACER 4741G 笔记本刷1.31版bios黑屏,救砖处理
  12. 常用颜色及RGB配色表
  13. 疯狂HTML5 CSS 3 JavaScript讲义 (李刚) 高清PDF扫描版
  14. 了解 React 之 Suspense 和 lazy
  15. 引擎所有固定变量大全
  16. Failed to read artifact descriptor for
  17. linux 缩小硬盘镜像,缩小qcow2格式kvm虚拟镜像磁盘大小[转]
  18. MapReduce概述及MapReduce详细实现
  19. 前端 · 深入理解 transform 函数的计算原理 ①
  20. 黑苹果安装包(MaxOS)及教程——如何在非苹果电脑上安装MaxOS系统

热门文章

  1. C语言优惠套餐推荐系统
  2. 2022最新个人发卡网站源码+支持傻瓜式安装/全开源的
  3. MySQL更新的常见问题
  4. 魔鬼交易员害了法兴银行却救了全球经济?
  5. 「MOSS - 16」MOSS队:Scrum Meeting 7
  6. js仿新浪微博消息发布功能
  7. 电路原理图中的各种地(数字地、模拟地、信号地、直流地、交流地、屏蔽地)的区别
  8. 01教育学的产生和发展
  9. 赏红叶,是金秋心旷神怡之事
  10. php面向对象之tian,php之面向对象