摘要:
在Java中,使用线程来异步执行任务。Java线程的创建与销毁需要一定的开销,如果我们为每一个任务创建一个新线程来执行,这些线程的创建与销毁将消耗大量的计算资源。同时,为每一个任务创建一个新线程来执行,这种策略可能会使处于高负荷状态的应用最终崩溃。 Java的线程既是工作单元,也是执行机制。从JDK 阅读全文
摘要:
当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i=1,A线程更新i+1,B线程也更新i+1,经过两个线程操作之后可能i不等于3,而是等于2。因为A和B线程在更新变量i的时候拿到的i都是1,这就是线程不安全的更新操作,通常我们会使用synchronized来解决这个问 阅读全文
摘要:
在JDK的并发包里提供了几个非常有用的并发工具类。CountDownLatch、CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段,Exchanger工具类则提供了在线程间交换数据的一种手段。本章会配合一些应用场景来介绍如何使用这些工具类。 一、等待多线程完成的Coun 阅读全文
摘要:
Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。 第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 阅读全文
摘要:
一、ConcurrentHashMap的实现原理与使用 ConcurrentHashMap是线程安全且高效的HashMap。 1.1、为什么要使用ConcurrentHashMap JDK1.7(ReentrantLock+Segment+HashEntry) JDK1.8(Synchroized+ 阅读全文
摘要:
一、Lock接口 虽然它缺少了(通过synchronized块或者方法所提供的)隐式获取释放锁的便捷性,但是却拥有了锁获取与释放的可操作性、可中断的获取锁以及超时获取锁等多种synchronized关键字所不具备的同步特性。 使用synchronized关键字将会隐式地获取锁,但是它将锁的获取和释放 阅读全文
摘要:
一、线程简介 1.1、什么是线程 1.2、为什么要使用多线程 1.3、线程优先级 1.4、线程的状态 Java线程在运行的生命周期中可能处于表4-1所示的6种不同的状态; 1.5、Daemon线程 Daemon线程是一种支持型线程,因为它主要被用作程序中后台调度以及支持性工作。这意味着,当一个Jav 阅读全文
摘要:
零、了解 Java线程之间的通信对程序员完全透明,内存可见性问题很容易困扰Java程序员,本章将揭开Java内存模型神秘的面纱。本章大致分4部分:Java内存模型的基础,主要介绍内存模型相关的基本概念;Java内存模型中的顺序一致性,主要介绍重排序与顺序一致性内存模型;同步原语,主要介绍3个同步原语 阅读全文
摘要:
一、volatile的应用 1.1、volatile的实现原理 原子性: 操作A和操作B: 对于操作A来说:操作B要么不执行,要么完全执行完。B对于A就有原子性 可见性:(加锁) 一个线程对一个变量进行修改,另外一个线程可以立马感知到,必须等待。 有序性: 代码执行的顺序和大脑想象的顺序是一样的,所 阅读全文
摘要:
一、上下文切换 CPU不停地切换线程执行,我们感觉多个线程是同时执行的,实际是来回切换时间片达到的,时间片的切换一般是 几十毫秒(ms) 1.1、如何减少上下文的切换 减少上下文切换的方法有无锁并发编程、CAS算法、使用最少线程、使用协程 1、无锁并发编程。 多线程竞争锁的时,会引起上下文的切换,所 阅读全文