Java并发编程(补充)
文章平均质量分 59
Alchemy_Ding
Java菜鸟找工作
展开
-
Java并发编程——锁(公平锁,非公平锁、可重入锁、自旋锁、死锁)
一、公平锁,非公平锁公平锁: 非常公平, 不能够插队,必须先来后到!非公平锁:非常不公平,可以插队 (默认都是非公平)public ReentrantLock() { sync = new NonfairSync();}public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync();}二、可重入锁可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁Synchroni原创 2021-08-19 00:57:37 · 149 阅读 · 0 评论 -
Java并发编程——CAS
什么是CAS?compare and swap,比较并交换。CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。 如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值 。否则,处理器不做任何操作。//CAS:compareAndSwap:比较并交换public class CASDemo { public static void main(String[] args) { AtomicInteger atomicInteger=n原创 2021-08-18 22:25:11 · 153 阅读 · 0 评论 -
Java并发编程——单例模式+单例模式不安全
一、饿汉式单例描述:这种方式比较常用,但容易产生垃圾对象。优点:没有加锁,执行效率会提高。缺点:类加载时就初始化,浪费内存。它基于 classloader 机制避免了多线程的同步问题,不过,instance 在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用 getInstance 方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化 instance 显然没有达到 lazy loading 的效果。//饿汉式单例public class H原创 2021-08-18 21:49:48 · 464 阅读 · 0 评论 -
Java并发编程——内存模型(JMM)+volatile
JMM:Java内存模型。JMM规定了内存主要划分为主内存和工作内存两种。主内存对应的是Java堆中的对象实例部分,工作内存对应的是栈中的部分区域。每条线程拥有各自的工作内存,工作内存中的变量是主内存中的一份拷贝。关于JMM的一些同步的约定1.线程解锁前,必须把共享变量立刻刷回主存。2.线程加锁前,必须读取主存中的最新值到工作内存中3.加锁和解锁是同一把锁8种操作1、lock(锁定):作用于主内存的变量,它把一个变量标识为一条线程独占的状态。2、unlock(解锁):作用于主内存的变量,它原创 2021-08-18 14:43:18 · 139 阅读 · 0 评论 -
Java并发编程——分支合并(ForkJoin)
ForkJoin并行执行任务!提高效率!大数据量!任务的分割与合并主流程ForkJoin特点:工作窃取这里面维护的都是双端队列测试代码://求和计算的任务/* * 如何使用forkjoin * 1.forkjoinPool通过它来执行 * 2.计算任务 forkjoinPool.execute(ForkJoinTask task) * 3.计算类要继承ForkJoinTask */public class ForkJoinDemo extends RecursiveTask&l原创 2021-08-18 00:46:08 · 256 阅读 · 0 评论 -
Java并发编程——Stream流式计算
java8的流式处理极大的简化了对于集合的操作,实际上不光是集合,包括数组、文件等,只要是可以转换成流,我们都可以借助流式处理,类似于我们写SQL语句一样对其进行操作。java8通过内部迭代来实现对流的处理,一个流式处理可以分为三个部分:转换成流、中间操作、终端操作。如下图:代码举例:public class Test { /* * 现在有5个用户!筛选,一行代码实现 * 1.ID必须是偶数 * 2.年龄必须大于23岁 * 3.用户名转为大写字母原创 2021-08-17 23:26:38 · 528 阅读 · 0 评论 -
Java并发编程——四大函数式接口
函数式接口:只有一个方法的接口如:Runnable、foreach等一、Function:函数式接口传入参数T,返回类型R//Function 函数式接口,有一个输入参数,有一个输出参数//只要是函数式接口就可以用lambda表达式简化public class Demo01 { public static void main(String[] args) { //工具类:输出输入的值 /*Function function =new Function&l原创 2021-08-17 22:52:13 · 325 阅读 · 0 评论 -
Java并发编程——线程池
一、池化技术程序运行的本质是占用系统资源,而池化技术可以优化资源的使用。池化技术:事先准备好一些资源,有人要用,就来拿,用还之后还给线程池(生活类似场景:共享充电宝)线程池的好处:1.降低资源的消耗2.提高响应的速度3.方便管理(线程复用、控制最大并发数、管理线程)二、线程池(三大方法)1.newSingleThreadExecutor()newSingleThreadExecutor()方法创建一次执行单个任务的执行程序。//Executorspublic class Demo01原创 2021-08-17 22:05:17 · 156 阅读 · 0 评论 -
Java并发编程——同步队列(SynchronousQueue)
SynchronousQueue是无界的,是一种无缓冲的等待队列,但是由于该Queue本身的特性,在某次添加元素后必须等待其他线程取走后才能继续添加;可以认为SynchronousQueue是一个缓存值为1的阻塞队列。public class SynchronousQueueDemo { public static void main(String[] args) { BlockingQueue<String> blockingQueue=new Synchronous原创 2021-08-17 20:44:21 · 761 阅读 · 0 评论 -
Java并发编程——阻塞队列(BlockingQueue)
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。以下所有测试使用的队列长度为3一、抛出异常1.添加:add()使用add()方法向队列中添加元素,若多添加,会报java.lang.IllegalStateExcep原创 2021-08-17 19:00:20 · 555 阅读 · 0 评论 -
Java并发编程——读写锁(ReadWriteLock)
一、ReadWriteLock介绍来自JDK1.8 api文档ReadWriteLock maintains a pair of associated locks, one for read-only operations and one for writing. The read lock may be held simultaneously by multiple reader threads, so long as there are no writers. The write lock is e原创 2021-08-16 14:48:15 · 204 阅读 · 0 评论 -
Java并发编程——常用的辅助类(CountDownLatch、CyclicBarrier、Semaphore)
一、CountDownLatchCountDownLatch:允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。//计数器public class CountDownLatchDemo { public static void main(String[] args) throws InterruptedException { //总数是6,必须要执行任务的时候再使用 CountDownLatch countDownLatch = new Cou原创 2021-08-16 00:31:20 · 208 阅读 · 0 评论 -
Java并发编程——并发下HashMap不安全问题(ConcurrentHashMap)
问题再现:并发下对Map进行add和遍历输出,出现java.util.ConcurrentModificationException异常public class MapTest { public static void main(String[] args) { Map<String,String> map=new HashMap<>(); for (int i = 0; i < 30; i++) { new T原创 2021-08-15 23:30:44 · 511 阅读 · 0 评论 -
Java并发编程——并发下HashSet不安全问题(CopyOnWriteSet)
问题再现:并发下对Set进行add和遍历输出,出现java.util.ConcurrentModificationException异常public class SetTest { public static void main(String[] args) { Set<String> set = new HashSet<String>(); for (int i = 0; i < 30; i++) { new原创 2021-08-15 22:48:32 · 936 阅读 · 0 评论 -
Java并发编程——并发下ArrayList不安全问题(CopyOnWriteArrayList)
问题再现:并发下1对ArrayList进行add和遍历输出,出现java.util.ConcurrentModificationException异常public class ListTest { public static void main(String[] args) { List<String> list = new ArrayList<String>(); for (int i = 0; i < 10; i++) {原创 2021-08-15 22:23:24 · 324 阅读 · 0 评论 -
Java并发编程——八门金锁(8锁现象)
现象一public class Test1 { public static void main(String[] args) { Phone phone=new Phone(); new Thread(()->{ phone.sendSms(); },"A").start(); try { TimeUnit.SECONDS.sleep(1); } catch (I原创 2021-08-15 19:00:08 · 207 阅读 · 0 评论 -
Java并发编程——wait()虚假唤醒
在生产者和消费者问题中,使用wait()方法可能造成的虚假唤醒和解决方法问题代码:public class A { public static void main(String[] args) { Data data = new Data(); new Thread(()->{ for (int i = 0; i < 10; i++) { try { dat原创 2021-08-15 17:08:46 · 285 阅读 · 0 评论