Lock: 重入锁ReentrantLock 发表于 2017-01-15 | 分类于 Java锁 重入锁ReentrantLock,表示该锁能够支持一个线程对资源的重复加锁。此外,还支持获取锁时的公平和非公平性选择,默认为非公平性的。 synchronized关键字隐式的支持重进入。 实现重进入重进入是指任意线程在获取到锁之后能够再次获取该锁而不会被锁所阻塞。该特性要解决两个问题: 线程再 ... 阅读全文 »
Lock: 队列同步器AbstractQueuedSynchronizer 发表于 2017-01-07 | 分类于 Java锁 概述队列同步器(AbstractQueuedSynchronizer,AQS),是用来构建锁或其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。 队列同步器是实现锁(也可以是任意同步组件)的关键,在锁的实现中聚合同步器,利用同步器实现 ... 阅读全文 »
Lock: 概述 发表于 2017-01-07 | 分类于 Java锁 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问 共享资源(但是有些锁可以允许多个线程并发的访问共享资源,如读写锁)。 Lock与synchronizedLock接口出现之前,Java程序是靠synchronized关键字实现锁功能的,而Java SE 5之后,并发包 ... 阅读全文 »
线程: 启动和终止 发表于 2017-01-07 | 分类于 Java SE 创建线程Java 中创建有两种方法:继承 Thread 类、实现 Runnable 接口,在程序开发中只要是多线程,肯定永远以实现 Runnable 接口为主。 实现 Runnable 接口相比继承 Thread 类有如下优势: 可以避免由于 Java 的单继承特性而带来的局限; 增强程序的健壮性 ... 阅读全文 »
JMM: final域的内存语义 发表于 2017-01-07 | 分类于 JMM 与volatile和锁相比,对final域的读写更像是普通变量的访问。 final域的重排序规则对于final域编译器和处理器需要遵守两个重排序规则: 在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 初次读一个包含final域的对象 ... 阅读全文 »
JMM: 锁的内存语义 发表于 2017-01-07 | 分类于 JMM 锁是Java并发编程中最重要的同步机制,锁除了可以让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。 锁释放-获取内存语义锁的释放内存语义:线程释放锁时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存中。 锁的获取内存语义:线程获取锁时,JMM会把线程对应的本地内存置为无 ... 阅读全文 »
JMM: volatile的内存语义 发表于 2017-01-07 | 分类于 JMM volatile关键字可以保证变量的可见性,也就是新值能立即同步到主内存,以及使用前立即从主内存刷新。 可见性:对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。原子性:对任意单个volatile变量的读/写具有原子性,但是对于复合操作如volatile++ ... 阅读全文 »
JMM: 顺序一致性 发表于 2017-01-07 | 分类于 JMM 顺序一致性内存模型是一个理论参考模型。 数据竞争与顺序一致性当程序未正确同步时,就会存在数据竞争。 Java内存模型规范对数据竞争的定义:在一个线程中写一个变量,在另一个线程读同一个变量,而且写和读没有通过同步来排序。 如果程序是正确同步的,程序的执行将具有顺序一致性。即程序的执行结果与该程序在 ... 阅读全文 »
Java与线程 发表于 2017-01-06 | 分类于 Java SE 并发不一定依赖多线程(例如PHP的多进程并发),但是在Java里面讨论并发大多数和线程离不开。 线程是比进程更轻量级的调用执行单位,是CPU调度的基本单位。 线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程共享资源,又可以独立调度。 相关:线程与进程 线程的实现实现线程主要有3种方式 ... 阅读全文 »
JMM: Java内存模型 发表于 2017-01-06 | 分类于 JMM 硬件效率与一致性一般来说,“让计算机并发执行若干个运算任务”(多任务处理)可以“更充分地利用计算机处理器的效能”。但是其中一个重要的复杂性(问题)来源是:绝大多数的运算任务不可能只靠处理器的计算就能完成,处理器还需要和内存交互,如读取运算数据、存储原酸结果等,这些I/O操作很难消除。 由于计算机的存 ... 阅读全文 »