多线程并发编程
Chay Wong
这个作者很懒,什么都没留下…
展开
-
StampedLock原理及使用
JDK1.8之前, 锁已经那么多了, 为什么还要有StampedLock?一般应用, 都是读多写少, ReentrantReadWriteLock 因读写互斥, 故读时阻塞写, 因而性能上上不去。 可能会使线程饥饿官方代码例子public class StampedLockDemo { // 成员变量 private double x, y; // 锁实例 ...原创 2019-02-17 14:00:42 · 2271 阅读 · 1 评论 -
什么是并发编程
并发历史:早期计算机–从头到尾执行一个程序,资源浪费操作系统出现–计算机能运行多个程序,不同的程序在不同的单独的进程中运行一个进程,有多个线程提高资源的利用率,公平 串行与并行的区别: ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190212181306400.png?x-oss-process=image/watermark,type_ZmF...原创 2019-02-12 18:25:50 · 1233 阅读 · 0 评论 -
并发编程的挑战之频繁的上下文切换
cpu为线程分配时间片,时间片非常短(毫秒级别),cpu不停的切换线程执行,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态,让我们感觉是多个程序同时运行的我们知道上下文的频繁切换,会带来一定的性能开销, 那么如何减少上下文切换的开销?无锁并发编程:多线程竞争锁时,会引起上下文切换,所以多线程处理数据时, 可以用一些方法来避免使用锁, 如将数据的ID按照Has...原创 2019-02-12 18:50:13 · 653 阅读 · 0 评论 -
进程与线程的区别
做一个简单的自我总结吧进程:是系统进行分配和管理资源的基本单位线程:进程的一个执行单元, 是进程内调度的实体、是CPU调度和分派的基本单位, 是比进程更小的独立运行的基本单位。线程也被称为轻量级进程, 线程是程序执行的最小单位。一个程序至少一个进程, 一个进程至少一个线程。进程有自己的独立地址空间, 每启动一个进程, 系统就会为它分配地址空间, 建立数据表来维护代码段、堆栈段和数据段, 这...原创 2019-02-13 17:01:43 · 20424 阅读 · 0 评论 -
线程的状态及其相互转换
我们都知道线程的几个状态, 从源码可以看出不通过代码分析的都是耍流氓~/** * 线程状态Demo */public class ThreadStateDemo { public static void main(String[] args) { // NEW// Thread thread = new Thread(); ...原创 2019-02-14 09:28:37 · 876 阅读 · 0 评论 -
锁降级详解
锁降级: 写线程获取写入锁后可以获取读取锁, 然后释放写入锁, 这样就从写入锁变成了读取锁, 从而实现锁降级的特征public class LockDegrade { public static void main(String[] args) { ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantRe...原创 2019-02-17 11:51:24 · 6427 阅读 · 3 评论 -
线程的优先级
线程的优先级告诉程序该线程的重要程度有多大。 如果有大量程序都被堵塞, 都在等候运行, 程序会尽可能地运行优先级的那个程序。 但是, 这并不表示优先级较低的线程不会运行。 若程序的优先级较低, 只不过表示它被允许允许的机会小一些而已。线程的优先级设置可以为1-10的任一数值, Thread类中定义了三个线程优先级, 分别是:MIN_PRIORITY(1)、NORM_PRIORITY(5)、MAX...原创 2019-02-15 14:31:37 · 1602 阅读 · 0 评论 -
什么是线程安全性
当多个线程访问某个类, 不管运行环境采用何种调度方式或者这些线程如何交替执行, 并且在主调代码中不需要任何额外的同步或协同, 这个类都能表现出正确的行为, 那么就称这个类为线程安全的。-- 《并发编程实战》什么是线程不安全?多线程并发访问时, 得不到正确的结果。...原创 2019-02-15 17:28:13 · 392 阅读 · 0 评论 -
如何避免线程安全性问题
线程安全性问题成因多线程环境多个线程操作同一共享资源对该共享资源进行非原子性操作如何避免打破成因中三点中任一点多线程环境 – 将多线程改单线程(必要的代码加锁访问)多个线程操作同一共享资源 – 不共享资源(ThreadLocal、不共享、操作无状态、不可变)对共享资源进行了非原子性操作 – 将非原子性操作改成原子性操作(加锁、使用JDK自带的原子性操作的类、JUC提供的相应的...原创 2019-02-16 00:23:42 · 466 阅读 · 0 评论 -
如何阅读源码?
一段简单的代码看构造看类之间的关系,形成关系图看使用到的方法,并逐步理解,边看代码边看注释debug原创 2019-02-16 11:31:41 · 161 阅读 · 0 评论 -
读写锁特性及ReentrantReadWriteLock的使用
特征: 写写互斥、读写互斥、读读共享锁降级: 写线程获取写入锁或可以获取读取锁, 然后释放写入锁, 这样就从写入锁变成了读取锁, 从而实现锁降级的特征先看一个错误例子public class ReentrantReadWriteLockDemo { private int i = 0; private int j = 0; public void out() { ...原创 2019-02-17 10:00:43 · 237 阅读 · 0 评论