
java多线程
面汤放盐
这个作者很懒,什么都没留下…
展开
-
线程基础
一、进程与线程1.1 两者区别 区别 进程 线程 单元 作为资源分配的单元 作为程执行和调度的单元 开销 每个进程都独立的代码和数据空间,进程之间切换,开销很大 线程可以看做轻量级进程,线程可以共享代码、数据空间,每个线程都有自己独立的程序计数器和运行栈等,切换线程相对进程开销小二、线程实现2.1 实现方式...原创 2018-06-05 15:42:50 · 114 阅读 · 0 评论 -
java5同步集合类的应用
一、 软件包 java.util.concurrent 的描述在并发编程中很常用的实用工具类。此包包括了几个小的、已标准化的可扩展框架,以及一些提供有用功能的类,没有这些类,这些功能会很难实现或实现起来冗长乏味。下面简要描述主要的组件。另请参阅 locks 和 atomic 包。二、执行程序接口。 Executor 是一个简单的标准化接口,用于定义类似于线程的自定义子系统,包括线程...原创 2018-06-23 21:31:55 · 2116 阅读 · 0 评论 -
volatile关键字
一、volatile 关键字 多线程比单线程更多的性能消耗,应用得当,则提高效率,提高不当,降低效率; JVM会为每个线程分配一个独立的缓存以此来提高效率如果一个变量被volatile关键字修饰,那么所有线程都是可见的。所谓可见就是,当一条线程修改了这个变量值,新值对于其他线程来时是立即可见的volatile 关键字:当多个线程进行操作共享数据时,可以保证内存中的数据可见, ...原创 2018-06-04 18:17:14 · 376 阅读 · 0 评论 -
原子变量与 CAS 算法
一、原子变量/* * 一、i++ 的原子性问题:i++ 的操作实际上分为三个步骤“读-改-写” * int i = 10; * i = i++; //10 * * int temp = i; * i = i + 1; * i = temp; */1.2 原子性案例案例一package tes...原创 2018-06-06 16:19:49 · 214 阅读 · 0 评论 -
ForkJoinPool 分支合并框架
一、ForkJoinPool 分支合并框架 Fork/Join 框架: 在必要的情况下,将一个大任务,进行拆分(fork) 成若干个小任务(拆到不可再拆),再将一个一个的小任务运算的结果进行join汇总。1.1 案例...原创 2018-06-05 22:13:25 · 1646 阅读 · 0 评论 -
java线程池
一、线程池线程的创建和关闭是需要花费一定的时间,线程本身也会占用资源,所以对线程控制的好,能够提高系统吞吐量,处理不好,得不偿失。1.1 什么是线程池像数据库连接池管理数据库连接,线程池是管理线程的一个池子。在使用线程池后,创建线程变成了从池子中取,关闭线程变成了放回线程池。1.2 JDK对线程池的支持在JDK中提供了一套·Executor框架来实现线程池。...原创 2018-06-09 22:27:34 · 287 阅读 · 0 评论 -
并发包中的DelayQueue工具
一、DelayQueue并发工具无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期的时间最长。如果没有任何延迟到期 ,那么就不会有任何头元素,并且poll()将返回null。(正因为这样,不能将null放置到这种队列中)1.1 代码分析package myThread;i...转载 2018-06-10 12:36:41 · 246 阅读 · 0 评论 -
并发工具类 CopyOnWriteArrayList
一、高效读取CopyOnWriteArrayList由于读操作根本不会修改原有的数据,因此对于每次读取操作都进行加锁其实是一种资源浪费。 应该允许多个线程同时访问List的内部数据,毕竟是安全的。根据读写锁的思想,读与读之间不冲突,但是读操作会受到写操作的影响,当发生写操作时,读就必须等待,否则可能读到不一致的数据。同理,如果读操作正在进行,程序也不能进行写入。1.1 CopyOn...原创 2018-06-10 12:36:17 · 206 阅读 · 0 评论 -
线程的基本操作
一、java多线程状态变化参考《java多线程编程核心技术》–高洪岩《实战Java高并发程序设计》原创 2018-06-10 17:41:00 · 248 阅读 · 0 评论 -
synchronized锁重入
一、关键字synchronized关键字synchronized拥有锁重入的功能,即在使用synchronized时,当一个线程得到一个对象锁后,再次请求此对象锁时,是可以再次得到该对象的锁。这也证明在一个synchronized方法/块的内部调用本来的其他synchronized方法/块时,是永远可以得到锁的。1.1 代码分析public class Service { s...原创 2018-06-10 20:13:21 · 548 阅读 · 0 评论 -
并发包中的阻塞队列的应用
一、java5阻塞队列的应用一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列获取操作则是从队列头部开始获得元素1.1 API API 描述 ArrayBlockingQueue(int capacity) 创建一个...原创 2018-06-05 22:28:24 · 422 阅读 · 0 评论 -
并发包中的Exchanger同步工具
一、Exchanger同步工具可以在对中对元素进行配对和交换的线程的同步点。每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象。Exchanger 可能被视为 SynchronousQueue 的双向形式。Exchanger可能在应用程序(比如遗传算法和管道设计)中很有用。1.1 API API 描述 V...原创 2018-06-06 16:16:34 · 197 阅读 · 0 评论 -
并发包中的CountDownLatch同步工具
一、CountDownLatch同步工具一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待1.1 API API 描述 CountDownLatch(int count) 构造一个用给定计数初始化的 CountDownLatch。 void await() 使当前线程在锁存器倒计数至零之前一直等待,除非...原创 2018-06-06 14:30:53 · 195 阅读 · 0 评论 -
线程阻塞工具类 LockSupport(笔记)
一、线程阻塞工具类LockSupportLockSupport是一个非常方便实用的线程阻塞工具,它可以在线程内任意位置让线程阻塞。和Thread.suspend()相比,它弥补了由于resume()在前发生,导致线程无法继续执行的情况。和Object.wait()相比,它不需要先获得某个对象的锁,也不会抛出InterruptedException异常1.1 接口描述LockSupp...原创 2018-06-11 21:28:01 · 531 阅读 · 0 评论 -
重入锁java.util.concurrent.locks.ReentrantLock(笔记)
一、重入锁重入锁可以完全代替synchronized关键字.在JDK5.0的早期版本中,重入锁的性能远远好于synchronized,但是从JDK6.0开始.JDK在synchronized上做了大量的优化.使得两者的性能差距不大·重入锁对于逻辑控制的灵活性要远远好于synchronized,但是要必须释放锁,否则 其他线程就会一直等待!另外重入锁允许一个线程连续几次获取同一把锁,但是...原创 2018-06-11 22:04:55 · 1934 阅读 · 0 评论 -
跳表 SkipList
查看:https://blog.youkuaiyun.com/u014427196/article/details/52454462原创 2018-06-11 22:30:07 · 123 阅读 · 0 评论 -
BlockingQueue实现同步通信
一、BlockingQueueBlockingQueue有一个重要的特征,当生产者线程向BlockingQueue放入元素时,如果队列已满,则生产者线程阻塞;当消费者线程试图向BlockingQueue取元素时,如果队列为空,则需要消费者线程阻塞。通过两个线程交替的向BlockingQueue放入和读取元素,即可很好地控制线程的通信。1.1 API 简介 API 描...原创 2018-06-05 14:06:21 · 699 阅读 · 0 评论 -
java多线程基础案例(笔记)
一、传统线程1.1 Thread中的部分源码public class Thread implements Runnable {…… private Runnable target;…… private void init(ThreadGroup g, Runnable target, String name, long stack...原创 2018-06-05 22:34:04 · 303 阅读 · 0 评论 -
java并发包(上)
一、 java5原子性操作类的应用如果变量是线程共享的。例如成员变量,且有多个线程对这个变量进行访问,才做同步。如果是局部变量,则不存在共享问题。线程私有,所以也就不存在安全问题。1.1 案例class Programmer implements Runnable { @Override public void run() { AtomicInte...原创 2018-06-05 16:04:44 · 806 阅读 · 0 评论 -
并发包中的 Semaphere同步工具
一、java5的Semaphere同步工具Semaphore 可以维护当前访问自身的线程个数,并提供了同步机制,使用Semaphere可以控制同时访问资源的线程个数。如有必要,在许可可用前会阻塞每一个acquire(),然后再获取该许可。每个release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore只对可用许可的号码进行计数,并采取相...原创 2018-06-06 16:18:48 · 266 阅读 · 0 评论 -
并发包中的 CyclicBarrier同步工具
一、CyclicBarrier 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。1.1 API API 描述 CyclicBarrier(...原创 2018-06-06 15:51:08 · 220 阅读 · 0 评论 -
并发包中的ReadWriteLock读写锁
一、ReadWriteLock读写锁读写锁ReadWriteLock,是JDK1.5 中提供的读写分离锁,读写分离锁可以有效地帮助减少锁竞争,以提升系统性能。ReadWriteLock维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有 writer,读取锁可以由多个 reader 线程同时保持。写入锁是独占的 接口 描述 Lock rea...原创 2018-06-06 21:26:19 · 337 阅读 · 0 评论 -
高并发的基础概念
一、高并发的常用概念1.1 同步(Synchronous)和异步(Asynchronous)很明显,同步调用会等待方法的返回,异步调用会瞬间返回,但是异步调用瞬间返回并不代表你的任务就完成了,他会在后台起个线程继续进行任务。1.2 并发(Concurrency)和并行(Parallelism) 并行则是两个任务同时进行,而并发呢,则是一会做一个任务一会又切换做另一个任...原创 2018-06-10 20:34:35 · 523 阅读 · 0 评论