并发编程
Lin_Dong_Tian
不积跬步,无以至千里!
展开
-
JavaWeb面经(二):2019.9.16 Synchronized关键字底层原理及作用
Java 虚拟机中的同步(Synchronization)基于进入和退出管程对象,即Monitor对象实现。同步有两种:1、显式同步:有明确的 monitorenter 和 monitorexit 指令,即同步代码块。2、隐式同步:没有monitor指令,由ACC_SYNCHRONIZED标识,即同步方法。在 Java 语言中,同步用的最多的地方可能是被 synchronized ...转载 2019-09-16 15:14:30 · 378 阅读 · 0 评论 -
Fork/Join框架
一、什么是Fork/Join框架 Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。Fork/Join框架要完成两件事情: 1.任务分割:首先Fork/Join框架需要把大的任务分割成足够小的子任务,如果子任务比较大的话还要对子任务进行继续分割 2.执行任务并合并结果:分割的...原创 2019-05-29 23:53:15 · 125 阅读 · 0 评论 -
Java并发容器和框架--ConcurrentLinkedQueue
一、非阻塞队列CurrentLinkedQueue 在并发编程中我们有时候需要使用线程安全的队列。如果我们要实现一个线程安全的队列有两种实现方式一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循环CAS的方式来实现,例如使用非阻塞的方式来实现线程安全队列Conc...转载 2019-05-29 21:22:37 · 398 阅读 · 0 评论 -
Java并发容器和框架--ConcurrentHashMap
一、ConcurrentHashMap的引入 ConcurrentHashMap是线程安全并且高效的HashMap,在并发编程中经常可见它的使用,在开始分析它的高并发实现机制前,看看它是如何被引入jdk的。1、HashMap线程不安全:可以借鉴:https://www.jianshu.com/p/e2f75c8cce012、Hashtable线程安全,但是效率低下:Hasht...原创 2019-05-29 17:21:46 · 173 阅读 · 0 评论 -
Java中的锁--LockSupport工具和Condition接口
六、LockSupport工具 LockSupport定义了一组以park开头的方法来阻塞当前线程,以及unpart(Thread thread)方法来唤醒线程。 在Java 6中,LockSupport增加了三个方法:用于替代原来的方法 part(Object blocker)、parkNanos(Object object,lon...原创 2019-05-29 11:52:09 · 477 阅读 · 0 评论 -
Java中的锁--重入锁、读写锁
一、重入锁 重入锁ReentrantLock:就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。除此之外,该锁的还支持获取锁时的公平和非公平性选择。 Mutex是一个不支持重进入的锁。而synchronized关键字隐式的支持重进入,比如一个synchronized修饰的递归方法,在方法执行时,执行线程在获取了锁之后仍能连续多次地获得该锁,而不像Mut...原创 2019-05-29 11:50:51 · 811 阅读 · 0 评论 -
Java中的锁--队列同步器及其实现分析
一、队列同步器(AQS) 队列同步器AbstractQueuedSynchronizer(以下简称同步器),是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作,并发包的作者(Doug Lea)期望它能够成为实现大部分同步需求的基础。 同步器的主要使用方式是继承,子类通过继承同步器并实现它...原创 2019-05-29 11:48:52 · 522 阅读 · 0 评论 -
Java内存模型(三)--volatile
一、JMM保证共享对象的可见性 如果一个字段被声明为volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。 而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。 另外,通过synchronized和Lock也能够保证可见性,s...原创 2019-05-24 15:04:59 · 271 阅读 · 0 评论 -
Java内存模型(二)
一、JMM与并发编程Java内存模型定义了多线程之间共享变量的可见性以及如何在需要的时候对共享变量进行同步。1、在并发编程领域,有两个关键问题:线程之间如何通信和如何同步。2、线程之间的通信机制有两种共享内存和消息传递。(1)在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信,典型的共享内存通信方式就是通过共享对象进行通信。(2...原创 2019-05-24 09:15:14 · 142 阅读 · 0 评论 -
Java内存模型(一)
一、Java内存模型概述 多任务和高并发是衡量一台计算机处理器的能力重要指标之一。如果我们要想深入了解Java并发编程,就要先理解好Java内存模型。Java内存模型定义了多线程之间共享变量的可见性以及如何在需要的时候对共享变量进行同步。 内存模型可以理解为在特定的操作协议下,对特定的内存或者高速缓存进行读写访问的过程抽象,不同架构下的物理机拥有不一样的内存模型,Ja...转载 2019-05-23 15:57:59 · 177 阅读 · 0 评论 -
Java中的并发工具类--CountDownLatch、CyclicBarrier、Semaphore和Exchanger
一、在JDK的并发包里提供了几个非常有用的工具类:CountDownLatch CyclicBarrier Semaphore Exchanger 前三个提供了一种并发流程控制的手段,Exchanger工具类则提供了在线程间交换数据的一种手段。二、等待多线程完成的CountDownLatch1、CountDownLatch允许一个或多个线程等待其他线程完成操作。 ...原创 2019-05-30 11:38:59 · 335 阅读 · 0 评论 -
Java中的锁--Lock
一、Lock接口 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源(但是有些锁可以允许多个线程 并发的访问共享资源,比如读写锁)。在Lock接口出现之前,java程序靠synchronized关键字实现锁功能,在JDK SE 5之后,并发包中新增了Lock接口,来实现锁功能,它提供了与synchronized类似的功能。它提供了与sync...原创 2019-05-29 11:44:35 · 293 阅读 · 0 评论 -
Executor框架
一、线程池基本架构顶层是Executor 二、Executor框架的两级调度 在HotSpot VM的线程模型中,Java线程(java.lang.Thread)被一对一映射为本地操作系统线程。Java线程启动时会创建一个本地操作系统线程。当该Java线程终止时,这个操作系统线程也会被回收。操作系统会...原创 2019-05-26 15:34:31 · 154 阅读 · 0 评论 -
java并发编程--线程池
一、为什么要使用线程池? 在java中,如果每个请求到达就创建一个新线程,开销是相当大的。在实际使用中,服务器在创建和销毁线程上花费的时间和消耗的系统资源都相当大,甚至可能要比在处理实际的用户请求的时间和资源要多的多。除了创建和销毁线程的开销之外,活动的线程也需要消耗系统资源。如果在一个jvm里创建太多的线程,可能会使系统由于过度消耗内存或“切换过度”而导致系统资源不足。为了防止资...原创 2019-05-25 16:23:45 · 443 阅读 · 0 评论 -
Java并发编程基础----线程
一、线程介绍 现代操作系统运行一个程序时,会为其创建一个进程。现代操作系统的最新调度单位就是线程,线程也称为轻量级进程。一个进程中可以包含多个线程,这些线程有自己的计数器、堆栈、和局部变量属性,并且能够访问共享的内存变量。java程序天生就是一个多线程,一个普通的java程序不仅仅只有main()方法的运行,而且还有其他多个线程在运行。二、为什么要使用多线程? ...原创 2019-05-25 10:01:41 · 128 阅读 · 0 评论 -
锁的内存语义
一、锁的释放和获取的内存语义 当线程释放锁时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存中。 当线程获取锁时,JMM会把该线程对应的本地内存置为无效。从而使得被监视器保护的临界区代码必须要从主内存中去读取共享变量。对比锁释放-获取的内存语义与volatile写-读的内存语义: 可以看出:锁释放与volatile写有相同的内存语义;锁获取与vola...转载 2019-05-24 22:50:15 · 161 阅读 · 0 评论 -
线程安全
一、线程安全 当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。 这里讨论的线程安全,就限定于多个线程之间存在共享数据访问这个前提,因为如果一段代码根本不会与其他线程共享数据,那么从线程安全的角度来看,程序是串行执行还是多线程...原创 2019-05-24 16:14:13 · 173 阅读 · 0 评论