java多线程系列
全面总结java多线程相关知识
javaduqing
duqingfeng.net
展开
-
ConcurrentHashMap源码理解(1.7)
请先阅读: HashMap源码分析 Hashtable类注释翻译、源码分析 一、前言先来复习下HashMap、HashTable。 HashMap是基于哈希表实现的。每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。 数据结构可表示如下: HashTable是HashMap是线程安全版,但是使用synchronized来保证线程原创 2017-12-16 19:45:52 · 687 阅读 · 0 评论 -
B树(B-树)插入、删除操作
一、定义B树是一种平衡的多分树,通常我们说m阶的B树,它必须满足如下条件: (1)每个结点至多有m个子结点; (2)除根结点和叶结点外,其它每个结点至少有ceil(m/2)个子结点; (3)根结点至少有两个子结点;(唯一例外的是根结点就是叶子结点) (4)所有的叶结点在同一层; (5)有k个子结点的非根结点恰好包含k-1个关键码,关键码按照递增次序进原创 2017-12-01 12:24:07 · 20285 阅读 · 5 评论 -
AQS同步队列与条件队列的关系
本文图片来源: http://javadoop.com/post/AbstractQueuedSynchronizer-2 http://blog.csdn.net/tb3039450/article/details/69056169一、关系同步队列节点来源一:同步队列依赖一个双向链表来完成同步状态的管理,当前线程获取同步状态失败 后,同步器会将线程构建成一个节点,并将其加入同步队列中。同步队列原创 2017-11-21 21:08:36 · 8825 阅读 · 2 评论 -
尝试阅读ReentrantLock、AbstractQueuedSynchronizer源码(二)
尝试阅读ReentrantLock、AbstractQueuedSynchronizer源码 (一)这篇文章希望通过对 AbstractQueuedSynchronizer 内部类 ConditionObject 的探索,加深对阻塞唤醒机制的理解!一、await()方法流程ReentrantLock lock = new ReentrantLock(true);Condition con = lo原创 2017-11-21 20:29:58 · 548 阅读 · 0 评论 -
尝试阅读ReentrantLock、AbstractQueuedSynchronizer源码(一)
提起ReentrantLock,想必大家最熟悉的就是这lock()、unlock()这两个方法了,那今天就从这入手吧!一、类结构三个内部类:Sync、FairSync、NonfairSyncSync : 同步器基类 FairSync : 实现公平锁的同步器 NonfairSync : 实现非公平锁的同步器Sync 继承 AbstractQueuedSynchronizer;FairSync、No原创 2017-11-21 14:57:05 · 579 阅读 · 4 评论 -
volatile无法保证i++原子性的解决方案
一、阻塞算法与非阻塞算法1、阻塞算法以常见的同步实现方式synchronized为例,同一时间段,同一个锁,只能有一个线程获得,其他未获取到的线程阻塞,直到拥有锁的线程释放锁。下图演示了一个阻塞算法保证一个共享数据结构的行为:2、非阻塞算法线程A请求某种操作,如果系统无法响应;则通知A线程,A可先去执行其他操作;下图演示了一个非阻塞算法保证一个共享数据结构的行为:二、Volatile 变量存在的问题原创 2017-11-05 17:58:55 · 3382 阅读 · 2 评论 -
java多线程(4)内存模型概述
一、可见性可见性:一个线程对共享变量值的修改,能够及时地被其他线程看到。 共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量。java内存模型(JMM) java内存模型(java Memory Model)描述了java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取出变量这样的底层细节。①所有变量都存储在主内存中原创 2017-01-28 23:44:02 · 427 阅读 · 0 评论 -
java多线程(3)生产者消费者问题(二)
一、疑问如果我们想执行具体唤醒哪个阻塞的线程,应该怎么做?在之前解决线程安全的过程中,虽然我们可以理解同步代码块和同步方法的锁对象问题, 但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁, 为了①更清晰的表达如何加锁和释放锁 ②指定具体唤醒哪个线程 JDK5以后提供了一个新的锁对象Lock。使用Lock改写生产者消费者问题(只改动了Resource类):package com.thread原创 2017-07-02 18:37:22 · 308 阅读 · 0 评论 -
Java多线程(2)生产者消费者问题(一)
一、问题描述在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。如何用代码描述此类问题。二、一个消费者线程、一个生产者线程有几点需要强调: 1.main方法中的资源res的线程t1、t2共享的。所以原创 2017-07-02 18:34:55 · 599 阅读 · 0 评论 -
java多线程(1)基础
一、创建线程的两种方法①继承Thread类class MyThread extends Thread{ @Override public void run(){ }}MyThread mt = new MyThread();mt.start();②实现Runnable接口class MyThread implements Runnable{ @Override原创 2017-01-28 21:39:41 · 386 阅读 · 0 评论