zyc的博客

疾风亦有归途

概述

在并发场景下通常会有多个线程访问某个共享资源,此时我们能够立马想到的解决方法是给某个方法加上synchronized关键字,这样就能够保证同一时刻只有一个线程访问这个共享变量。但是synchronized属于独占锁,而独占锁是一种悲观锁,会导致其它正在尝试访问同步资源的线程挂起,等待持有锁的线程释放锁,在并发量很大的情况下性能表现很差。而另一个更加有效的锁就是乐观锁。所谓乐观锁就是,每次访问共享资源时不加锁而是假设没有冲突而去完成某项操作,只会在最后修改共享资源时判断一下有没有其它线程修改过这个共享资源,如果有修改的话就重新尝试,直到成功为止。本文要介绍的CAS就是一种乐观锁实现方式。

阅读全文 »

概述

在ThreadLocal源码分析一文中我们知道了它能够提供给线程在生命周期内访问的变量。现在我们考虑一个场景,在我们的业务中有一个很耗时的操作,需要开启多个线程去提升执行的效率,并且这些子线程都需要使用到执行程中的某个变量。我们立马能够想到在创建子线程的时候将这个变量通过构造函数传递进去,这是很容易想到的方案,那么还有没有更加优雅的解决方式呢?本文要介绍的InheritableThreadLocal就是基于此场景的一种解决方案。通过它我们可以在创建子线程时,自动的将执行线程拥有的变量传递给子线程。

阅读全文 »

概述

ThreadLocal意为线程局部变量的意思,它提供了一种存活在线程生命周期内变量。也就是说从线程开始运行到结束我们都可以通过ThreadLocal的get方法获取这个变量的值。例如在spring-security中有关认证的信息默认就是保存在一个ThreadLocal中的。因此每一个http请求都可以从当前请求的线程中获取到认证信息。

阅读全文 »

概述

程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对数字在内存中的bit位,即二进制位进行操作。在java中位运算分为按位操作符和移位操作符两种。

阅读全文 »

概述

Reference是什么?当我们定义一个变量时例如Object O=new Object(),这个o是变量名,new Object()是变量值,此时o就是一个引用变量,它引用了new Object()。在java中常见的引用有PhantomReference、SoftReference、WeakReference以及StrongReference,例如上面这个例子就是一个强引用。

阅读全文 »

概述

线程组表示一组线程。 此外线程组还可以包括其他线程组。 线程组形成一个树,其中除初始线程组(系统线程组)之外的每个线程组都有父节点。允许线程访问有关其自己的线程组的信息,但不允许访问有关其线程组的父线程组或任何其他线程组的信息。我们平常新建的线程都属于某个线程组,如果没有指定SecurityManager的话,默认新建的线程都属于当前创建线程所属的线程组。具体可以查看Thread源码的构造函数。

阅读全文 »

概述

synchronized意为同步的意思,使用它能够保证在多线程运行的情况下同步阻塞的访问共享数据。java中每一个对象都可以作为锁,这是synchronized实现同步的基础,本文将探讨synchronized的几种用法。

阅读全文 »

概述

Thread类中提供了很多实用的方法,借助这些方法我们可以方便快捷的调试多线程相关的代码,同时理解这些方法背后的原理也能够提高我们的编码能力。

阅读全文 »

概述

​ 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
​ 同一进程中的多个线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。
​ 一个进程可以有很多线程,每条线程并行执行不同的任务。

阅读全文 »