Java并发之ThreadLocal源码分析

ThreadLocal介绍

ThreadLocal是Java提供的一个线程局部变量的工具,虽说它是为线程服务,但是它并没有在Java的并发包里面,而是和Thread一样在java.lang包里,首先我们来看下ThreadLocal的基本用法。

一般情况下,我们需要一个成员变量,并且在线程里对成员变量修改,往往我们会这样写:

查看更多

Java并发之原子类源码分析(以AtomicInteger为例)

什么是原子类

在我之前的博客文章中介绍了JVM的内存模型,JVM内存模型规定了对一个变量的操作分为八步,这八步分别是:Lock(锁定)、unlock(解锁)、read(读取)、load(载入)、use(使用)、assign(赋值)、store(存储)、write(写入);也就是说,对于一个数的操作是分为八步完成的,即对一个数的操作不是一个原子操作,如:i++,在代码层面就一行代码,看似是原子操作,实际上在指令层面并不是一步完成的,而是多部完成的。这就造成了对于变量操作的线程安全问题。

查看更多

Java并发之ReentrantReadWriteLock源码分析

ReadWriteLock

ReadWriteLock是一个读写锁接口,所谓读写锁,是对访问资源共享锁和互斥锁,一般的重入性语义为如果对资源加了写锁,其他线程无法再获得写锁与读锁,但是持有写锁的线程,可以对资源加读锁(锁降级);如果一个线程对资源加了读锁,其他线程可以继续加读锁。

查看更多

七种常用排序算法介绍

介绍

排序算法是指将一串乱序数据按照一定规则进行排列的算法;虽然排序是一个很简单的问题,但是对于排序算法的研究已经进行很多年;排序研究至今已经诞生了很多种排序算法了,而最常用常见的排序算法有七种,分别是:选择排序、插入排序、希尔排序、冒泡排序、归并排序、快速排序和堆排序。

很多其他的算法思想都源自基本排序算法,通过学习研究基本的排序算法,能有助于我们理解掌握基本排序算法衍生出来的其他算法。

查看更多

Java并发之ReentrantLock源码分析

Lock介绍

Lock在Java中是一个接口,在这个接口中仅仅定义了6个方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public interface Lock {

void lock();

void lockInterruptibly() throws InterruptedException;

boolean tryLock();

boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

void unlock();

Condition newCondition();
}

查看更多

Java并发之AQS类介绍

AQS类介绍

AQS类全称AbstractQueuedSynchronizer,Java在AQS类中提供了一系列的模板代码,用来实现Java中一系列的同步工具,很多同步工具都是通过内部类继承自AQS类,通过重写AQS类的方法来实现的,如ReentrantLock类、ReentrantReadWriteLock等。

AQS中使用了一个volatile的int类型变量state来表示线程状态,使用Node实现FIFO队列来完成线程的排队执行。

查看更多

Java并发之CAS算法介绍

CAS算法介绍

CAS算法全称为Compare and swap,翻译成中文就是“比较与交换”,是一种有名的无锁算法。无锁编程,就是指在不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步。

在CAS算法中需要理解3个操作数,内存值V,旧的预期值A,要修改的新值B。

当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做,这就是CAS算法。现代的CPU提供了特殊的指令,可以自动更新共享数据,而且能够检测到其他线程的干扰。

查看更多