2 徒步远方999
尚未进行身份认证
不要让任何一件事让你丢失持续学习的能力!
在java多线程中,我们知道可以用synchronize关键字来实现线程间的同步互斥工作,还有更加优秀的机制去实现同步互斥工作,Lock对象。重入锁和读写锁,他们具有比synchronize更加强大的功能,并且具有嗅探锁定,多路分支等功能。 一、ReentrantLock(重入锁)(详见JDK-API)public class UseReentrantLock { priva...
一、Semaphore(详见JDK-API) 一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。 二、应用场景 在semamphor...
一、CyclicBarrier(JDK-API) 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。例如:每个线程代表一个跑步运动员,当每...
一、Executor框架提供的线程池(参考JDK6—API) 二、JDK提供自定义线程池(参考JDK6—API) 三、JDK提供自定义线程池详细说明(参考JDK6—API) 三、自定义拒绝策略 在实际应用中我们通常采用DiscardOldestPllicy策略,如果出现高并发的情况下,无法完全执行所有的任务。当然我们也可以自定义拒绝策略,把拒绝的任务摘要写进日志或...
并行设计模式属于设计优化的一部分,它是对一些常用的多线程结构的总结和抽象。与串行程序相比,并行程序的结构通常更为复杂。因此合理的使用并行模式在开发中更有意义,目前在开发中应用最多的是Future,Master-Woker和生产者-消费者模式 一、Future模式 流程图如下public interface Data { String getRequest();}...
在并发队列上,JDK提供了两种实现,一个是以ConcurrentLinkQueue为代表的高性能的队列,一个是以BlockingQueue接口为代表的阻塞队列,无论哪种都继承自Queue 一、ConcurrentLinkedQueue ConcurrentLinkedQueue:是一个适用于高并发场景下的队列,通过无锁的方式,实现了高并发状态下的高性能,通常ConcurrentLin...
本文由以下三个部分组成(特别说明:此文参考今日头条技术文档) 1、讲解缓存更新策略 2、对每种策略进行缺点分析 3、针对缺点给出改进方案 正文 先做一个说明,从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案。这种方案下,我们可以对存入缓存的数据设置过期时间,所有的写操作以数据库为准,对缓存操作只是尽最大努力即可。也就是说如果数据库写成功,缓存更新失败...
一、ConcurrentMap concurrentMap接口下面有两个重要实现: ConcurrentHashMap ConcurrentSkipListMap(支持并发排序功能,弥补ConcurrentHashMap)1、ConcurrentHashMap内部使用段(segment)来表示这些不同的部分,每个段其实就是一个小的HashTable,它们有自己的锁。只要多个修...
一、概念 线程局部变量,是一种多线程并发访问变量的解决方案。与synchronized等加锁的方式不同,ThreadLocal完全不提供锁。而使用以空间换时间的手段,为每个线程提供变量的副本,以保证线程安全。 从性能上来说,ThreadLocal不具有绝对的优势,在并发不是很高的时候,加锁的性能会更好,但是作为一套与锁完全无关的线程安全解决方案,在高并发量或者竞争激烈的场景,使用T...
在多线程模式中,考虑到性能和线程安全问题,一般选择两种比较经典的单例模式,既能提高性能,也能保证线程安全 1、double check instance 双重检查锁定 原理参考链接:双重检查锁定原理链接public class DubbleSingleton { private volatile static DubbleSingleton ds; public...
一、BlockingQueue支持阻塞队列 此例子主要是模拟LinkBlockingQueue中put和take方法public class SimulationQueue { // 1 装载元素的容器 private final List<Object> list = Lists.newArrayList(); // 2 计数器 pri...
一、概念 线程是操作系统中独立的个体,这些线程如果不通过特殊的手段进行处理,就无法组成一个完整的整体。因此线程通信就称为组成一个整体的必须条件之一。当线程之间存在通信,那么系统之间的交互就会更加强大。在提高CPU使用率的前提下,会使开发人员对线程任务在开发的过程中进行有效的把控和监督。 使用wait/notify实现线程之间的通信。这两个方法都是Object的类方法。也就是jav...
一、概念 在java中,每一个线程都会有自己的工作内存区域,在主内存中对共享变量值进行拷贝,形成副本,放在每个线程独自的内存区域。当各自的线程运行时,会在自己的内存区域操作这些变量的值,为了存取一个共享的变量,一个线程通常获锁定并且清除自己的内存工作区,把这些共享变量的值从所有线程共享内存区域中正确的装入到自己的工作内存区域,当线程解锁时,把工作区域的变量值刷新到主内存中的共享变量中。...
一、对象锁和类锁 1、线程安全:当多个线程访问某一个类(对象或者方法),这个类始终能够表现出正确的行为, 那么此类(对象或者方法)是线程安全的 synchronized:可以在任意对象或者方法上加锁,而加锁的这段代码称为‘互斥区’或者临界区2.对象锁和类锁具体参考:对象锁和类锁示例3.脏读:读到了共享变量中未刷新的值 二、重入锁 1、重入锁:关键字synchronized...
一、java8对时间的新应用 LocalDate,LocalTime,LocalDateTime
一、传统时间,日期,日期格式是变化的,多线程访问下都是线程不安全的,解决此不安全问题实例如下 public class DateFormateThreadLocal { private static final ThreadLocal df = new ThreadLocal(){ @Override protected DateFormat initialV...
原理: 当线程在多核运行时,比如每一个核分配一个线程,当某一个线程阻塞,另外其他线程继续处理任务,当其他处理完了,此阻塞线程才刚开始执行任务任务,造成内存利用不足。java8在此做了相当大的改进,分为分拆个很多个小任务,在多核内存上执行,当其他线程任务队列执行完成,会偷偷的去拿阻塞队列中未执行完的进行执行,达到充分利用内存资源,高效的目的代码示例:public class For...
方法如下: HELP->Edit Custom VM OPtions中加: -Dfile.encoding=utf-8
此博客为转发
一、简介 Docker是一个开源的应用容器引擎;是一个轻量级容器技术;Docker支持将软件编译成一个镜像;然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像;也就是说在docker上安装好各种软件,打包成一个镜像,可以在其他的虚拟上安装,直接启动docker容器中已经安装好的软件,只需要安装一次即可,达到复用的目的docker主机(Host): 安装了Doc...