1. Java并发 - CAS与原子变量

    在 Java 并发领域,我们解决并发安全问题最粗暴的方式就是使用 synchronized 关键字了,但它是 一种独占形式的锁,属于悲观锁机制,性能会大打折扣。volatile 貌似也是一个不错的选择,但 volatile 只能保持变量的可见性,并不保证变量的原子性操作。

    2021/08/06 concurrent

  2. 设计模式之 - 单例模式

    单例模式是软件开发过程中经常用到的一种设计模式,但如果优雅的实现单例模式,并不是一个简单的问题。

    2021/08/06 design-pattern

  3. JVM - 对象的内存布局

    在 HotSpot 虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、 实例数据(Instance Data)和对齐填充(Padding)。

    2021/07/29 JVM

  4. JVM目录汇总

    JVM知识梳理 内存区域 Class对象 引用类型 垃圾回收

    2021/07/29 JVM

  5. JVM - jstack工具

    jstack是JDK中自带的Java工具之一,用于生成虚拟机当前时刻的线程快照,含有正在执行的方法堆栈的集合信息, 生成线程快照的主要目的是定位线程出现长时间停顿的原因, 如线程间死锁、死循环、请求外部资源导致的长时间等待等问题。

    2021/07/29 JVM

  6. Java并发 - 锁分类

    锁概述 线程安全问题的产生前提是多个线程并发访问共享变量、共享资源(以下统称为共享数据)。 那么一种保障线程安全的方法是将多个线程对共享数据的并发访问转换为串行访问,即一个共享数据一次 只能被一个线程访问,该线程访问结束后其他线程才能对其进行访问。锁(Lock)就是利用这种思路以保障 线程安全的线程同步机制。

    2021/07/29 concurrent

  7. Java并发 - volatile 实现原理

    在多线程并发编程中 synchronized 和 volatile 都扮演着重要的角色,volatile 是轻量级的 synchronized,它在多处理器开发中保证了共享变量的”可见性”。可见性的意思是当一个线程修改一个 共享变量时,另外一个线程能读到这个修改的值。如果 volatile 变量修饰符使用恰当的话,它比 synchronized 的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。但是,volatile 不能保证原子性。

    2021/07/29 concurrent

  8. Java并发 - synchronized 关键字

    在多线程并发编程中 synchronized 一直是元老级角色,很多人都会称呼它为重量级锁。但是,随着 Java SE 1.6 对 synchronized 进行了各种优化之后,有些情况下它就并不那么重了。本文详细介绍 Java SE 1.6 中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构 和升级过程。

    2021/07/29 concurrent

  9. Java并发 - 并发设计模式

    在软件工程中,设计模式是针对某一类共同问题的解决方案。这种解决方案被多次使用,而且已 经被证明是针对该类问题的最优解决方案。每当你需要解决这其中的某个问题,就可以使用它们来避 免做重复工作。其中,单例模式(Singleton)和工厂模式(Factory)是几乎每个应用程序中都要用到 的通用设计模式。 并发处理也有其自己的设计模式。本节,我们将介绍一些最常用的并发设计模式,以及它们的 Java 语言实现。

    2021/07/27 concurrent

  10. Java并发 - 并发数据结构

    Java API 中的常见数据结构(例如 ArrayList、Hashtable 等)并不能在并发应用程序中使用,除非采用某种外部同步机制。但是如果你采用了某种同步机制,应用程序就会增加大量的额外计算时 间。而如果你不采用同步机制,那么应用程序中很可能出现竞争条件。如果你在多个线程中修改数据, 那么就会出现竞争条件,你可能会面对各种异常(例如 ConcurrentModificationException 和 ArrayIndexOutOfBoundsException),出现隐性数据丢失,或者应用程序会陷入死循环。

    2021/07/27 concurrent