4.并发编程
文章平均质量分 82
郑学炜
这个作者很懒,什么都没留下…
展开
-
2.多线程的优缺点
1. 和进程相比,它是一种非常"节俭"的多任务操作方式。对进程而言,创建一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时...原创 2018-03-22 13:28:40 · 861 阅读 · 0 评论 -
14.Java中CAS操作详解
在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁锁机制存在以下问题:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。volatile是不错的机制,但是volatile不能保证原子性。因...原创 2018-03-27 18:21:55 · 647 阅读 · 0 评论 -
15.多线程编程中锁的4种状态-无锁状态 偏向锁状态 轻量级锁状态 重量级锁状态
一:java多线程互斥,和java多线程引入偏向锁和轻量级锁的原因?--->synchronized的重量级别的锁,就是在线程运行到该代码块的时候,让程序的运行级别从用户态切换到内核态,把所有的线程挂起,让cpu通过操作系统指令,去调度多线程之间,谁执行代码块,谁进入阻塞状态。这样会频繁出现程序运行状态的切换,线程的挂起和唤醒,这样就会大量消耗资源,程序运行的效率低下。为了提高效率,jvm的...原创 2018-03-27 18:53:06 · 3022 阅读 · 4 评论 -
13.Java多线程之Synchronized和Volatile的比较
Java多线程之内存可见性和原子性:Synchronized和Volatile的比较 在说明Java多线程内存可见性之前,先来简单了解一下Java内存模型。 (1)Java所有变量都存储在主内存中 (2)每个线程都有自己独立的工作内存,里面保存该线程的使用到的变量副本(该副本就是主内存中该变量的一份拷贝) (1)线程对共享变量的所有操作都必须在自己的工作内存中进行,不...原创 2018-04-16 00:27:21 · 266 阅读 · 0 评论 -
8.多线程死锁demo及其解决方案
Java线程死锁demo当线程中的同步代码有多个嵌套同步锁时容易发生死锁,下面的例子中2个线程公用2锁,一个拿着钱,要饭,一个拿着饭,要钱,互相不给,所以可能造成死锁现象:package dielock;public class Money implementsRunnable{ private Object money; private Object food; public ...原创 2018-04-16 00:51:58 · 487 阅读 · 0 评论 -
18.深入浅出线程池
摘要: 本文主要讲了Java当中的线程池的使用方法、注意事项及其实现源码实现原理,并辅以实例加以说明,对加深Java线程池的理解有很大的帮助。一般而言,线程池有以下几个部分:1.完成主要任务的一个或多个线程.2.用于调度管理的管理线程.3.要求执行的任务队列. 首先,讲讲什么是线程池?照笔者的简单理解,其实就是一组线程实时处于休眠状态,等待唤醒执行。那么为什么要有线程池这个东西呢?可以从以...原创 2018-03-29 13:57:56 · 302 阅读 · 0 评论 -
20.简单设计实现线程池
上代码之前,要先补充一下线程池构造的核心几个点1. 线程池里的核心线程数与最大线程数2. 线程池里真正工作的线程类worker3. 线程池里用来存取任务的队列4. 线程中的任务类task 另外一个比较简单的方法,推荐面试答这种,逻辑会比较好吧~ classThreadExcutor{ //创建 privatevolatileboolean RUNNING = tru...原创 2018-03-29 16:54:49 · 3152 阅读 · 0 评论 -
7.Java线程死锁及解决方案
Java线程死锁及解决方案要了解线程死锁,首先要明白什么是死锁死锁通俗点讲:死锁就是两个或两个以上的进程或线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。用简单一点的例子来说吧比如这个交通堵塞的例子,从图中可以看到四个方向行驶的汽车互相阻塞,如果没有任何一个方向的汽车退回去,那么将形成一个死锁上述图中有产生死锁的四个原因:1.互斥条件:一个...原创 2018-04-12 23:28:57 · 367 阅读 · 0 评论 -
21.多线程同步的几种方式
1、1.同步方法 (静态方法锁住类对象,其它方法锁住实例对象) 即有synchronized关键字修饰的方法。 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。 2.同步代码块 (锁住标记的对象) 即有synchronized关键字修饰的语句块。 被该关键字修饰的语句块会自...原创 2018-04-25 23:35:27 · 364 阅读 · 0 评论 -
19.线程池中的队列
runnableTaskQueue(任务队列):用于保存等待执行的任务的阻塞队列。 可以选择以下几个阻塞队列:BlockingQueue的几个注意点【1】BlockingQueue 可以是限定容量的。它在任意给定时间都可以有一个remainingCapacity,超出此容量,便无法无阻塞地put 附加元素。没有任何内部容量约束的BlockingQueue 总是报告Integer.MAX_VALUE...原创 2018-05-18 12:04:24 · 9252 阅读 · 1 评论 -
1.进程与线程
进程 线程 定义 程序在某个数据集合上的一次运行活动 进程中的一个执行路径 角色 系统进行资源分配和调度的一个独立单位 线程是进程的一个实体,是CPU调度和分派的基本单位,比进程更小的能独立运行的基本单位 资源共享 不能共享资源 共享所在进程的地址空间和其它资源。 线程还有自己的栈,程序计数器等寄存器 独立性 独立的地址空间,崩溃时保护模式下不会对其它进程产生影响 依赖于...原创 2018-03-22 11:35:34 · 236 阅读 · 0 评论 -
17.安全点与安全区
安全点:作用:解决在枚举根节点时引用关系变化的问题特征:是否具有让程序长时间执行的特征条件:指令序列复用,如方法调用、循环跳转、异常跳转什么是safepointsafepoint可以用在不同地方,比如GC、Deoptimization,在HotspotVM中,GC safepoint比较常见,需要一个数据结构记录每个线程的调用栈、寄存器等一些重要的数据区域里什么地方包含了GC管理的指针。从线程角度...原创 2018-04-08 17:33:40 · 3676 阅读 · 7 评论 -
6.Java多线程实现的四种方式
Java多线程实现的四种方式· 1.继承Thread类,重写run方法· 2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target· 3.通过Callable和FutureTask创建线程· 4.通过线程池创建线程前面两种可以归结为一类:无返回值,原因很简单,通过重写run...原创 2018-03-22 14:06:23 · 974 阅读 · 3 评论 -
3Java线程的5种状态及切换
.Java中的线程的生命周期大体可分为5种状态。1. 新建(NEW):新建了一个线程对象。2. 可运行(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权 。3. 运行(RUNNING):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代...原创 2018-03-24 00:01:27 · 353 阅读 · 0 评论 -
5.Java中sleep()与wait()区别
学习时正好碰到这两个方法,就查阅相关资料,并通过程序实现,进行区别一下:1、每个对象都有一个锁来控制同步访问,Synchronized关键字可以和对象的锁交互,来实现同步方法或同步块。sleep()方法正在执行的线程主动让出CPU(然后CPU就可以去执行其他任务),在sleep指定时间后CPU再回到该线程继续往下执行(注意:sleep方法只让出了CPU,而并不会释放同步资源锁!!!即需要用到此对象...原创 2018-03-24 00:26:49 · 487 阅读 · 0 评论 -
4.线程中的一些常用方法的用法 join()、yield()、sleep()、wait()、notify()、notifyAll()
1.线程休眠sleep();:线程有优先级,但是我们可以用此方法人为的改变它们的优先级,让线程暂停,它其他线程获得分配空间。 用法:Thread.sleep(2000);//休眠两秒 2.线程让步yield();就是让出自己的分配空间给其他线程,那么问题来了,让步多久呢?如果有两条线程的话,是不是让步到另外一条线程执行完呢?经测试,不是让另外的线程执行,让步时间是不确定的; 注意:当某个线程调用y...原创 2018-03-24 00:34:44 · 256 阅读 · 1 评论 -
9.并发编程的三个概念(原子性、可见性和有序性)存在的问题及其解决方案
以下是本文的目录大纲:一.内存模型的相关概念二.并发编程中的三个概念三.Java内存模型一.内存模型的相关概念大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因...原创 2018-03-24 15:18:19 · 3670 阅读 · 0 评论 -
10.并发线程的happens-before原则(先行发生原则)
下面就来具体介绍下happens-before原则(先行发生原则):· 程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作· 锁定规则:一个unlock操作先行发生于后面对同一个锁的lock操作。(先解锁,才可以在后面继续上锁)· volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作· ...原创 2018-03-24 15:42:42 · 1121 阅读 · 0 评论 -
11.多线程-volatile关键字解析
volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在了解volatile关键字时,可以先看一下上一篇博客了解一下与内存模型相关的概念和知识,然后此片文章才分析volatile关键字的实现原理,在给出了几个使用volatile关键字的场景。深入剖析volatile关键字在前面讲述了很多东西,其实都是为讲述vo...原创 2018-03-24 16:17:26 · 281 阅读 · 1 评论 -
12.多线程-synchronized关键字解析
本篇主要从另外一个博主上学习的,他对Java并发中synchronized关键字进行较为深入的探索,篇幅有点长,有些我还领悟得不是很好。但是我觉得该文章让我对同步的方法领悟到很多东西,所以整理后,加上一些自己的标注,就分享出来了。· synchronized的三种应用方式o synchronized作用于实例方法o synchronized作用于静态方法o sy...原创 2018-03-25 13:19:53 · 365 阅读 · 1 评论 -
16.无锁化编程有哪些常见方法
无锁化编程有哪些常见方法?· 针对计数器,可以使用原子加· 只有一个生产者和一个消费者,那么就可以做到免锁访问环形缓冲区(Ring Buffer)多个线程也不怕,利用queue去处理。(并发转成单线程)· RCU(Read-Copy-Update),新旧副本切换机制,对于旧副本可以采用延迟释放的做法· CAS(Compare-and-Swap...原创 2018-04-08 16:04:51 · 9102 阅读 · 0 评论 -
22.深入剖析ThreadLocal
Java并发编程:深入剖析ThreadLocal首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两个应用场景。 以下是本文目录大纲: 一.对ThreadLocal的理解 二.深入解析ThreadLocal类 三.ThreadLocal的应用场景ThreadLocal,很多地方叫做线程本地变量,也有些地方...原创 2018-05-24 10:15:13 · 233 阅读 · 0 评论