解决并发情况下的容器线程安全问题的.给多线程环境准备一个线程安全的容器对象. 线程安全的容器对象: Vector, Hashtable.线程安全容器对象,都是使用 synchronized 方法实现的. concurrent 包中的同步容器,大多数是使用系统底层技术实现的线程安全.类似 native. Java8 中使用 CAS. 1.Map/Set 1.1 ConcurrentHashMap/ConcurrentHashSet 底层哈希实现的同步 Map(Set).效率高,线程安全.使用系统底…
下面是我对java并发编程与高并发解决方案的学习总结: 1.并发编程的基础 2.线程安全—可见性和有序性 3.线程安全—原子性 4.安全发布对象—单例模式 5.不可变对象 6.线程封闭 7.线程不安全类 8.同步容器 9.J.U.C之AQS 10.线程的几种创建方式 11.FutureTask.Fork/Join. BlockingQueue 12.线程池 13.死锁 14.多线程并发最佳实践 15.spring的线程安全 16.HashMap与ConcurrentHashMap 17.多线程并…
1.并发编程基础 1.1 基本概念 CPU核心与线程数关系 Java中通过多线程的手段来实现并发,对于单处理器机器上来讲,宏观上的多线程并行执行是通过CPU的调度来实现的,微观上CPU在某个时刻只会运行一个线程.事实上,如果这些任务不存在阻塞,也就是程序中的某个任务因为该程序控制范围之外的某些条件(通常是I/O)而导致不能继续执行,由于在任务之间切换会产生开销,因此并行的效率可能没有顺序执行的效率高,并行也就没有意义. 一般来讲,CPU核心数和线程数的关系为核心数:线程数=1:1:但是如果使用了…
一.java并发编程的挑战 并发编程需要注意的问题: 并发编程的目的是让程序运行的更快,然而并不是启动更多的线程就能让程序最大限度的并发执行.若希望通过多线程并发让程序执行的更快,会受到如下问题的挑战: 线程的上下文切换问题.死锁问题.受限于硬件和软件的资源问题. 1.线程上下文切换 线程上下文切换简述:CPU通过时间片分配算法来循环执行任务,每个线程任务在正常情况下是被CPU轮询执行,当前任务执行完一个时间片后会切换到下一个线程任务.在切换前会保存上一个任务的执行状态,以便下次再切回这个任务时…
优秀软件的一个关键特征就是具有并发性.过去的几十年,我们可以进行并发编程,但是难度很大.以前,并发性软件的编写.调试和维护都很难,这导致很多开发人员为图省事放弃了并发编程.新版.NET 中的程序库和语言特征,已经让并发编程变得简单多了.随着Visual Studio 2012 的发布,微软明显降低了并发编程的门槛.以前只有专家才能做并发编程,而今天,每一个开发人员都能够(而且应该)接受并发编程. 1.1简介 首先,我来解释几个贯穿本书始终的术语.先来介绍并发. 并发 同时做多件事情 这个解释直接…
一.什么是关卡? 关卡类似于闭锁,它们都能阻塞一组线程,直到某些事件发生. 关卡和闭锁关键的不同在于,所有线程必须同时到达关卡点,才能继续处理.闭锁等待的是事件,关卡等待的是其他线程. 二.CyclicBarrier CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier).它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活. 当线程到达关卡点时,调用await方法,awa…
01.前言 先让我吐一句肺腑之言吧,不说出来会憋出内伤的.<Java 并发编程实战>这本书太特么枯燥了,尽管它被奉为并发编程当中的经典之作,但我还是忍不住.因为第四章"对象的组合"我整整啃了两周的时间,才啃出来点肉丝. 读者朋友们见谅啊.要怪只能怪我自己的学习能力有限,真读不了这种生硬无趣的技术书.但是为了学习,为了进步,为了将来(口号喊得有点大了),只能硬着头皮上. 请随我来,我尽量写得有趣点. 02.线程安全类 作者说了啊,设计一个线程安全类需要三个步骤: 1)找出表示…
Executor框架简介 在Java5之后,并发编程引入了一堆新的启动.调度和管理线程的API.Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动.执行和关闭,可以简化并发编程的操作.因此,在Java 5之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免this逃逸问题——如果我们在构造器中启动一个…
Java并发编程之-list集合的并发. 我们都知道Java集合类中的arrayList是线程不安全的.那么怎么证明是线程不安全的呢?怎么解决在并发环境下使用安全的list集合类呢? 本篇是<凯哥(凯哥Java:kagejava)并发编程学习>系列之<并发集合系列>教程的第一篇: 本文主要内容:怎么证明arrayList不是线程安全的?怎么解决这个问题?以及遇到问题解决的四个步骤及从源码来分析作者思路. 一:怎么证明arrayList在并发情况下是线程不安全的呢? 创建一个list…
1.如何创建并运行java线程 创建一个线程可以继承java的Thread类,或者实现Runnabe接口. public class thread { static class MyThread1 extends Thread{ @Override public void run() { System.out.println("run a myThread1"); } } static class MyThread2 implements Runnable{ @Override pub…
摘要 编写正确的并发程序对我来说是一件极其困难的事情,由于知识不足,只知道synchronized这个修饰符进行同步. 本文为学习极客时间:Java并发编程实战 01的总结,文章取图也是来自于该文章 并发Bug源头 在计算机系统中,程序的执行速度为:** CPU > 内存 > I/O设备 ** ,为了平衡这三者的速度差异,计算机体系机构.操作系统.编译程序都进行了优化: 1.CPU增加了缓存,以均衡和内存的速度差异 2.操作系统增加了进程.线程,已分时复用CPU,以均衡 CPU 与 I/O 设…
    并发基础   多进程  多线程 基于回调的非阻塞/异步IO     协程  协程  与传统的系统级线程和进程相比,协程的最大优势在于其“轻量级”,可以轻松创建上百万个而不会导致系统资源衰竭, 而线程和进程通常最多也不能超过1万个.这也是协程也叫轻量级线程的原因.多数语言在语法层面并不直接支持协程,而是通过库的方式支持,但用库的方式支持的功能也并不完整,比如仅仅提供轻量级线程的创建.销毁与切换等能力.如果在这样的轻量级线程中调用一个同步 IO 操作,比如网络通信.本地文件读写,都会阻塞其他…
CyclicBarrier(又叫障碍器)同样是Java5中加入的新特性,使用时需要导入Java.util.concurrent.CylicBarrier.它适用于这样一种情况:你希望创建一组任务,它们并发地执行工作,另外的一个任务在这一组任务并发执行结束前一直阻塞等待,直到该组任务全部执行结束,这个任务才得以执行.这非常像CountDownLatch,只是CountDownLatch是只触发一次的事件,而CyclicBarrier可以多次重用. 下面给出一个简单的实例来说明其用法: import…
概述 1.继承Thread 2.实现Runable接口 3.实现Callable接口通过FutureTask包装器来创建Thread线程 4.通过Executor框架实现多线程的结构化,即线程池实现.(该实现方式将会下一篇单独介绍) 1.继承Thread class CreateThreadByExtendThread extends Thread { public CreateThreadByExtendThread(String name) { super(name); } @Overrid…
个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.线程安全性-原子性-atomic-1 1.线程安全性 定义: 当某个线程访问某个类时,不管运行时环境采用何种调度方式或者这些锦城南将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的. 特点: 原子性:提供了互斥访问,同一时刻只能有一个线程来对它进行操作 可见性:一个线程对主内存的修改可以及时的被其他线程观察到 有序性:一个线程观察其他…
并发基础知识 一.线程的基本概念 线程表示一条单独的执行流,它有自己的程序计数器,有自己的栈. 1.创建线程 1)继承Thread Java中java.lang.Thread这个类表示线程,一个类可以继承Thread并重写run方法来实现一个线程: public class MyThread extends Thread{ @Override public void run() { System.out.println("thread name: " + Thread.currentT…
简单使用Lock锁 Java5中引入了新的锁机制——Java.util.concurrent.locks中的显式的互斥锁:Lock接口,它提供了比synchronized更加广泛的锁定操作.Lock接口有3个实现它的类:ReentrantLock.ReetrantReadWriteLock.ReadLock和ReetrantReadWriteLock.WriteLock,即重入锁.读锁和写锁.lock必须被显式地创建.锁定和释放,为了可以使用更多的功能,一般用ReentrantLock为其实例化…
个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.死锁 1.死锁的定义 所谓的死锁是指两个或两个以上的线程在等待执行的过程中,因为竞争资源而造成的一种互相等待的现象.若不受外力作用,他们都将无法推进下去.此时,处于系统中所处的状态就是死锁. 2.发生死锁所必须具备的条件: 互斥条件:它是指进程对所分配的资源进行排他性的使用,在一定时间内,某资源只由一个进程在用,如果此时还有其他进程请求资源,请求者只能等待.直到占有资源的进程用完或释放之后才可以继…
在操作系统中,信号量是个很重要的概念,它在控制进程间的协作方面有着非常重要的作用,通过对信号量的不同操作,可以分别实现进程间的互斥与同步.当然它也可以用于多线程的控制,我们完全可以通过使用信号量来自定义实现类似Java中的synchronized.wait.notify机制. Java并发包中的信号量Semaphore实际上是一个功能完毕的计数信号量,从概念上讲,它维护了一个许可集合,对控制一定资源的消费与回收有着很重要的意义.Semaphore可以控制某个资源被同时访问的任务数,它通过acqu…
阻塞队列 阻塞队列是Java5并发新特性中的内容,阻塞队列的接口是Java.util.concurrent.BlockingQueue,它有多个实现类:ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.PriorityBlockingQueue.SynchronousQueue等,用法大同小异,具体可查看JDK文档,这里简单举例看下ArrayBlockingQueue,它实现了一个有界队列,当队列满时,便会阻塞等待,直到有元素出队,后续的元素才可…
1.ThreadLocal Java中的ThreadLocal类可以让你创建的变量只被同一个线程进行读和写操作.因此,尽管有两个线程同时执行一段相同的代码,而且这段代码又有一个指向同一个ThreadLocal变量的引用,但是这两个线程依然不能看到彼此的ThreadLocal变量域.ThreadLocal类提供了get和set等访问接口,这些方法为每个线程都存有一个独立的副本,因此每次get总是返回当前线程上一次最小使用set设置的值. private ThreadLocal myThreadLo…
同步集合 Java中同步集合如下: Vector:基于数组的线程安全集合,扩容默认增加1倍(ArrayList50%) Stack:继承于Vector,基于动态数组实现的一个线程安全的栈 Hashtable:线程安全的k-v结构,k-v均不允许为null Collections.synchronizedXxx 通过synchronized将访问操作串行化,但会导致并发环境下效率低下 并发集合 ConcurrentHashMap:线程安全的HashMap实现 CopyOnWriteArrayLis…
1.同步容器类 同步容器类都是线程安全的,但在某些情况下可能需要额外的客户端加锁保护复合操作. 容器上常见的复合操作包括但不限于:迭代(反复访问数据,直到遍历完容器中所有的元素为止).跳转(根据指定顺序找到当前元素的下一个元素)以及条件运算(例如:如果没有则添加). 这些复合操作在没有客户端加锁的情况下仍然是线程安全的,但是当其他现场并发的修改容器时,它们就可能出现意料之外的行为. public static Object getLast(Vector list){ int lastIndex…
同步容器包括Vector和Hashtable,还有一些由Collections.synchronizedXxx等工厂方法创建的 1.同步容器类的问题 同步容器类都是线程安全的,但是有些时候还是要客户端加锁来保护复合操作 就比如vector的操作,如果又两个方法一个获取vector集合的最后一个元素,一个删除最后一个元素 那么可能两个线程在同时操作的时候,A线程首先正在获取最后一个元素,get(lastElement),而在这个过程中如果B元素正在删除,删除了最后一个(last)然后就可能导致A线…
1.实例封闭 class personset{ private final Set<Person> myset = new HashSet<Person>(); public void addPersom(Person p){ myset.add(p); } public boolean containPerson(Person p){ return myset.contains(p); } } 这个类的状态是由HashSet来进行管理的,这里的myset是私有的且并不会逸出,因此…
1. sorted函数: 常用的排序分:冒泡排序.选择排序.快速排序.插入排序.计数器排序 实例1:普通排序 # 普通排序 list1 = [,,,,] list2 = sorted(list1) # 升序排序 print(list1) print(list2) # [, , , , ] # [, , , , ] 实例2:按绝对值大小排序 # 按绝对值大小排序 list3 = [,-,,,-] # key接受函数来实现自定义排序规则,取绝对值排序后,在添加绝对值 # list4 = sorted…
1. filter函数: 原型:filter(fn,lsd) 参数1为函数 参数2为序列 功能:用于过滤序列,把传入的函数一次作用域序列每个元素,根据返回的是True还是False决定是否保留该元素. 实例1: # 实例1: # 判断是不是偶数 list1 = [,,,,,,,,] # 删选条件 def func(num): # 偶数保留 == : return True # 奇数剔除 return False l = filter(func,list1) # [func()] print(li…
1. map()函数: 原型:map(fn,lsd) 参数1是函数 参数2是序列 功能:将传入的函数一次作用在序列中的每一个元素.并把结果作为一个新的Iterator返回.其实map函数就是一个for循环查找.需要functools库. 图示: 实例1: # 实例1:from functools import reduce# python内置的map函数 def chr2int(str): ,,,,,,,,,}[str] # return后面哪一窜表示将单个字符转换成对应的字面量整数,按照键去取…
操作系统: 多道技术背景: 提高工作效率(充分利用IO阻塞的时间) 同时执行多个任务 多道技术 空间复用:充分的利用内存空间 时间复用:充分利用IO阻塞时间 分时系统: 并发:提高了程序的工作效率 两项工作: 1:进程之间的切换 2:保护现场,保留你进程执行的状态 并行 应用多核,多个任务在同时执行 同步 异步 阻塞 非阻塞…
本文在 Java线程面试题 Top 50的基础上,对部分答案进行进行了整理和补充,问题答案主要来自<Java编程思想(第四版)>,<Java并发编程实战>和一些优秀的博客,当然还有我个人的拙见,添加部分大多用不同颜色进行了区别以方便阅读. 前言 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发.调试.…