深入理解Java多线程(三):JUC基础篇
这篇文章主要侧重讲 JUC 的多数类的使用,文章里贴了很多练习的代码,可以通过代码更加深刻的了解这些类的功能。
这篇文章主要总结了 volatile、原子类、ReentrantLock、CountDownLatch、CyclicBarrier、Phaser、Semphore、Exchanger 的使用,然后进行了一些对比。
这篇文章主要侧重讲 JUC 的多数类的使用,文章里贴了很多练习的代码,可以通过代码更加深刻的了解这些类的功能。
这篇文章主要总结了 volatile、原子类、ReentrantLock、CountDownLatch、CyclicBarrier、Phaser、Semphore、Exchanger 的使用,然后进行了一些对比。
学了一段时间多线程方面的知识了总感觉掌握的知识有些散乱,在网上搜了一些面试问题总结梳理一下。
Java 中有四种方式实现一个线程。
使用 suspend 可以挂起一个线程,使用 stop 可以终结一个线程,但这些方法已经不推荐使用,存在安全性问题,停止一个线程最好的方式是让它自然结束,常用的方式是使用一个 volatile 变量来控制线程是否继续运行。
suspend、stop 不再推荐使用的原因是容易引发死锁,当一个线程持有锁的时候它被挂起或暂停掉了,此时锁还没有释放,其他线程无法获取所就会出现思索,最好的方式是让线程自然结束。
Java 线程在 JDK1.2 之前,是基于称为“绿色线程”的用户线程实现的,而在 JDK 1.2 中,线程模型替换为基于操作系统原生线程模型来实现,因此,在目前的 JDK 版本中,操作系统支持怎样的线程模型,在很大程度上决定了 Java 虚拟机的线程是怎样映射的,这点在不同平台上没有办法达成一致,虚拟机规范中也并未限定 Java 线程需要使用哪种线程模型来实现。
举个例子,对于 Sun JDK 来说,它的 Windows 版与 Linux 版都是使用一对一的线程模型实现的,一条 Java 线程就是映射到一条轻量级进程之中,因为 Windows 和 Linux 系统提供的线程模型就是一对一的。
总结:java 线程与操作系统线程是一对一的,在 linux 上通过调用 pthread 库创建线程。
SMART 可以指导我们置顶目标,评估目标的合理性,符合 SMART 原则的目标一般都是务实的,如果你也在苦恼于置顶目标、拆解目标不妨试试。
所谓 SMART 原则,即:
目标必须是具体的(Specific)
目标必须是可以衡量的(Measurable)
目标必须是可以达到的(Attainable)
目标必须和其他目标具有相关性(Relevant)
目标必须具有明确的截止期限(Time-based)
SMART 原则一 S(Specific)——明确性 所谓明确就是要用具体的语言清楚地说明要达成的行为标准。明确的目标几乎是所有成功团队的一致特点。很多团队不成功的重要原因之一就因为目标定的模棱两可,或没有将目标有效的传达给相关成员。
SMART 原则二 M(Measurable)——衡量性 衡量性就是指目标应该是明确的,而不是模糊的。应该有一组明确的数据,作为衡量是否达成目标的依据。
SMART 原则三 A(Attainable)——可实现性 目标是要可以让执行人实现、达到的,如果上司利用一些行政手段,利用权利性的影响力一厢情愿地把自己所制定的目标强压给下属,下属典型的反映是一种心理和行为上的抗拒:我可以接受,但是否完成这个目标,有没有最终的把握,这个可不好说。一旦有一天这个目标真完成不了的时候,下属有一百个理由可以推卸责任:你看我早就说了,这个目标肯定完成不了,但你坚持要压给我。
SMART 原则四 R(Relevant)——相关性 目标的相关性是指实现此目标与其他目标的关联情况。如果实现了这个目标,但对其他的目标完全不相关,或者相关度很低,那这个目标即使被达到了,意义也不是很大。
SMART 原则五 T(Time-based)——时限性 目标特性的时限性就是指目标是有时间限制的。例如,我将在 2005 年 5 月 31 日之前完成某事。5 月 31 日就是一个确定的时间限制。没有时间限制的目标没有办法考核,或带来考核的不公。上下级之间对目标轻重缓急的认识程度不同,上司着急,但下面不知道。到头来上司可以暴跳如雷,而下属觉得委屈。这种没有明确的时间限定的方式也会带来考核的不公正,伤害工作关系,伤害下属的工作热情。
Java 集合实现了常用数据结构,是开发中最常用的功能之一。
Java 集合主要的功能由三个接口:List、Set、Queue 以及 Collection 组成。
常见接口:
内部类是在一个类中的类,类的声明可在类中或方法中。
结构复杂体现下内部类的访问、内部类中使用外部类的成员变量等方面。
Lambda 是 JDK8 的新特性,Lambda 让 Java 支持了函数式的编程,如 JS 那样可以在参数中使用函数(JS 中函数是对象)。
这些特性是 Java8 的一些特性,使用这些特性能够简化我们的代码,让代码更清晰。
Java 相较于 C++具有内存自动管理功能,内存管理是个宽泛的概念,它即指实例化对象是的内存分配又指 GC 回收无用的类、对象、变量等。随着 JVM 不断发展,JVM 内存区也在不断变化,这些变化在 Java 语言层面感知不到,因为字节码屏蔽了底层实现,了解 JVM 内存区域是深入学习 Java 的第一步,今天总结一下。
操作 Excel 设置单元格样式是比较繁琐的,还有导入导出是设置的 Header 信息,为了简化这些操实现了如下工具类。工具类具有设置单元格的基本背景颜色、字体、字号、字体颜色、边框等,还实现了导入导出、磁盘读写 Excel。
这个工具类来源于我们项目的实践,简化了一些重复性的工作,欢迎尝试,欢迎提出问题。
环境 win10,idea 2019.3,git 2.23.0
在 Windows 中使用 idea 开发中 git 操作通常在 Git Bash 中进行,操作时总要打开一个 Bash 窗口(如下图),虽然对开发影响不大,但每次都去项目目录还是增加使用复杂性。
为了在每次使用 Git 时不打开这个窗口,可以对 idea 的 Terminal 进行改造,这样使用就方便许多了。不对 idea Terminal 改造也可以使用 Git,但终端是 Windows 的 CMD,对于一个习惯使用 Linux 总有些别扭。
改造后 idea 的终端运行的是 Git 的 Shell,可以使用 Linux 的常用命令,同时 Git 的操作输出也有色彩,开发体验直接起飞。