202203-09 10张图总结出并发编程最佳学习路线 目录最佳学习路线并发基础Java并发集合并发工具类Java内存模型(JMM)线程池阻塞队列锁Atomic其他总结我们开始今天的正文。首先,来看一下今天分享的并发编程最佳学习路线包含哪些内容。最佳学习路线接下来,我们再来依次看下具体要学习哪些知识吧。并发基础Java并发集合并发工具类Java内存模型(JMM)线程池阻塞队列锁Atomic其他总结本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注自学编程网的更多内容!... 继续阅读 >
202109-28 分析并发编程之LongAdder原理 目录一、前言二、LongAdder类的使用三、LongAdder原理的直观理解四、源码分析五、与AtomicInteger的比较六、思想的抽象一、前言ConcurrentHashMap的源码采用了一种比较独特的方式对map中的元素数量进行统计,自然是要好好研究一下其原理思想,同时也能更好地理解ConcurrentHashMap本身。本文主要思路分为以下5个部分:1.计数的使用效果2.原理的直观图解3.源码的细节分析4.与AtomicInteger的比较5.思想的抽象学习的入口自然是map的p... 继续阅读 >
202109-14 分析Java并发编程之信号量Semaphore 目录一、认识Semaphore1.1、Semaphore的使用场景1.2、Semaphore使用1.3、Semaphore信号量的模型二、Semaphore深入理解2.1、Semaphore基本属性2.2、Semaphore的公平性和非公平性2.3、其他Semaphore方法一、认识Semaphore1.1、Semaphore的使用场景Semaphore的使用场景主要用于流量控制,比如数据库连接,同时使用的数据库连接会有数量限制,数据库连接不能超过一定的数量,当连接到达了限制数量后,后面的线程只能排队等前... 继续阅读 >
202109-09 Java并发编程之线程间的通信 目录一、概念简介1、线程通信2、等待通知机制3、基础方法二、等待通知原理1、基本原理2、实现案例三、管道流通信1、管道流简介2、使用案例四、生产消费模式1、业务场景2、代码实现五、源代码地址一、概念简介1、线程通信在操作系统中,线程是个独立的个体,但是在线程执行过程中,如果处理同一个业务逻辑,可能会产生资源争抢,导致并发问题,通常使用互斥锁来控制该逻辑。但是在还有这样一类场景,任务执行是有顺序控制的,例如常... 继续阅读 >
202106-19 golang 并发编程之生产者消费者详解 golang最吸引人的地方可能就是并发了,无论代码的编写上,还是性能上面,golang都有绝对的优势学习一个语言的并发特性,我喜欢实现一个生产者消费者模型,这个模型非常经典,适用于很多的并发场景,下面我通过这个模型,来简单介绍一下golang的并发编程go并发语法协程go协程是golang并发的最小单元,类似于其他语言的线程,只不过线程的实现借助了操作系统的实现,每次线程的调度都是一次系统调用,需要从用户态切换到内核... 继续阅读 >
202105-19 Java并发编程之Semaphore的使用简介 简介Semaphore是用来限制访问特定资源的并发线程的数量,相对于内置锁synchronized和重入锁ReentrantLock的互斥性来说,Semaphore可以允许多个线程同时访问共享资源。Semaphored的使用构造方法Semaphore(intpermits):创建Semaphore,并指定许可证的数量。(公平策略为非公平)Semaphore(intpermits,booleanfair):创建Semaphore,并指定许可证的数量和公平策略。核心方法acquire():从Semaphore中获取一个许可证,如果获取不... 继续阅读 >
202103-05 Java 并发编程中如何创建线程 简介线程是基本的调度单位,它被包含在进程之中,是进程中的实际运作单位,它本身是不会独立存在。一个进程至少有一个线程,进程中的多个线程共享进程的资源。Java中创建线程的方式有多种如继承Thread类、实现Runnable接口、实现Callable接口以及使用线程池的方式,线程池将在后面文章中单独介绍,这里先介绍另外三种方式。继承Thread类优点:在run方法里可以用this获取到当前线程。缺点:由于Java不支持多继承,所以如果继承了Thr... 继续阅读 >
202102-20 Java并发编程之ReadWriteLock读写锁的操作方法 1.ReadWriteLock介绍为什么我们有了Lock,还要用ReadWriteLock呢。我们对共享资源加锁之后,所有的线程都将会等待。Lock读操作也锁,写操作也会锁,而对共享资源读的时候,其实是不用加锁的。当然读写同时存在的情况也会有。比如我们数据库常用操作有增删改查,增删改都是写操作,写操作必须加锁,而读操作可以共享。不是所有的操作都需要加锁。为了进一步提高复用性和粒度,写操作独占,读操作共享,不加锁。ReadWriteLock管理一... 继续阅读 >
202012-03 浅析Java 并发编程中的synchronized synchronized关键字,我们一般称之为“同步锁”,用它来修饰需要同步的方法和需要同步代码块,默认是当前对象作为锁的对象。在用synchronized修饰类时(或者修饰静态方法),默认是当前类的Class对象作为锁的对象,故存在着方法锁、对象锁、类锁这样的概念。一、没有设置线程同步的情况先给出以下代码感受下代码执行的时候为什么需要同步?代码可能比较枯燥,配上业务理解起来就会舒服很多,学生军训,有三列,每列5人,需要报数,... 继续阅读 >
202010-10 Java并发编程——volatile关键字 一、volatile是什么volatile是Java并发编程中重要的一个关键字,被比喻为“轻量级的synchronized”,与synchronized不同的是,volatile只能修饰变量,无法修饰方法及代码块等。下面是使用volatile关键字实现的单例模式:publicclassSingletonimplementsSerializable{privatestaticvolatileSingletonsingleton;privateSingleton(){}publicstaticSingletongetSingleton(){if(singleton==null){/... 继续阅读 >
202010-10 Java并发编程如何降低锁粒度并实现性能优化 在高负载多线程应用中性能是非常重要的。为了达到更好的性能,开发者必须意识到并发的重要性。当我们需要使用并发时,常常有一个资源必须被两个或多个线程共享。在这种情况下,就存在一个竞争条件,也就是其中一个线程可以得到锁(锁与特定资源绑定),其他想要得到锁的线程会被阻塞。这个同步机制的实现是有代价的,为了向你提供一个好用的同步模型,JVM和操作系统都要消耗资源。有三个最重要的因素使并发的实现会消耗大量资源,... 继续阅读 >
202010-09 深入分析Java并发编程之CAS 在Java并发编程的世界里,synchronized和Lock是控制多线程并发环境下对共享资源同步访问的两大手段。其中Lock是JDK层面的锁机制,是轻量级锁,底层使用大量的自旋+CAS操作实现的。学习并发推荐《Java并发编程的艺术》那什么是CAS呢?CAS,compareandswap,即比较并交换,什么是比较并交换呢?在Lock锁的理念中,采用的是一种乐观锁的形式,即多线程去修改共享资源时,不是在修改之前就加锁,而是乐观的认为没有别的线程和... 继续阅读 >
202010-08 Java并发编程volatile关键字的作用 日常编程中出现volatile关键字的频率并不高,大家可能对volatile关键字比较陌生,再深入一点也许是听闻volatile只能保证可见性而不能保证原子性,无法有效保证线程安全,于是更加避免使用volatile,简简单单加上synchronize关键字就完事了。本文稍微深入探讨volatile关键字,分析其作用及对应的使用场景。并发编程的几个概念简述首先简单介绍几个与并发编程相关的概念:可见性可见性是指变量在线程之间是否可见,JVM... 继续阅读 >
202010-08 java并发编程专题(十一)----(JUC原子类)数组类型详解 上一节我们介绍过三个基本类型的原子类,这次我们来看一下数组类型:AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray。其中前两个的使用方式差不多,AtomicReferenceArray因为他的参数为引用数组,所以跟前两个的使用方式有所不同。1.AtomicLongArray介绍对于AtomicLongArray,AtomicIntegerArray我们还是只介绍一个,另一个使用方式大同小异。我们先来看看AtomicLongArray的构造函数和方法:构造函数: &... 继续阅读 >
202010-08 java并发编程专题(十)----(JUC原子类)基本类型详解 这一节我们先来看一下基本类型:AtomicInteger,AtomicLong,AtomicBoolean。AtomicInteger和AtomicLong的使用方法差不多,AtomicBoolean因为比较简单所以方法比前两个都少,那我们这节主要挑AtomicLong来说,会使用一个,其余的大同小异。1.原子操作与一般操作异同我们在说原子操作之前为了有个对比为什么需要这些原子类而不是普通的基本数据类型就能满足我们的使用要求,那就不得不提原子操作不同的地方。当你在操作一个普通变量... 继续阅读 >
202010-08 java并发编程专题(九)----(JUC)浅析CyclicBarrier 上一篇我们介绍了CountDownlatch,我们知道CountDownlatch是“在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待”,即CountDownLatch的作用是允许1或N个线程等待其他线程完成执行,而我们今天要介绍的CyclicBarrier则是允许N个线程相互等待。1.CyclicBarrier简介CyclicBarrier的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到... 继续阅读 >