为你推荐

CountDownLatch 闭锁、FutureTask、Semaphore信号量、Barrier栅栏

  同步工具类可以是任何一个对象。阻塞队列可以作为同步工具类,其他类型的同步工具类还包括信号量(Semaphore)、栅栏(Barrier)、以及闭锁(Latch)。  所有的同步工具类都包含一些特定的结构化属性:它们封装了一些状态,这些状态将决定执行同步工具类的线程是继续执行还是等待,此外还提供了一些方法对状态进行操...

Java线程实现的第三种方式Callable方式与结合Future获取返回值

   多线程的实现方式有实现Runnable接口和继承Thread类(实际上Thread类也实现了Runnable接口),但是Runnable接口的方式有两个弊端,第一个是不能获取返回结果,第二个是不能抛出exception。但是Callable接口很好的解决了上面的问题。下面介绍Callable接口的使用方...

同步容器类与并发容器类

  同步容器类包括Vector和HashTable,这两个都是JDK早期的容器。后来在JDK1.2也引入一个功能与之类似的类,这些同步的封装容器类是由Collections.synchronizedXXX等工厂方法创建的。这些类实现线程安全的方式是:将他们的状态封装起来,并对每个公有方法都进行同步,使得每次只有线程能访...
代码星球·2020-08-27

原子类型的使用&Unsafe&CAS

  在项目中也经常可以见到原子类型(AtomicXXX)的使用,而且AtomicXXX常用来代替基本类型或者基本类型的包装类型,因为其可以在不加同步锁的情况下保证线程安全(只对于原子操作)。  下面以AtomicInteger为例子研究原子类型的线程安全性。  其实在  AtomicInteger&...

【多线程补充】SimpleDateFormat非线程安全与线程中、线程组中异常的处理

  类SimpleDateFormat主要负责日期的转换与格式化,但在多线程环境中,使用此类容易造成数据转换及处理的不正确,因为SimpleDateFormat类并不是线程安全的。1.多线程中存在的问题:packagecn.qlq.thread.seventeen;importjava.text.ParseExcept...

线程组的使用

  可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以用线程。这样的组织结构有点类似于树的形式。  线程组的作用是,可以批量的管理线程或者线程组对象,有效地对线程或线程组对象进行组织。  1级关联就是父对象中有子对象,但并不创建子孙对象。比如创建一些线程,为了有效地对这些线程进行组织管理...
代码星球·2020-08-27

POI 海量数据/大数据文件生成SXSSFWorkbook使用简介

  在之前我们知道处理xls的excel用的workbook是HSSFWorkbook,处理xlsx的excel用的是XSSFWorkbook。  上面两个类导出excel的时候数据会驻留在内存中,所以当数据量大的时候容易造成内存溢出。SXSSFWorkbook是用来生成海量excel数据文件,主要原理是借助临时存储空...

单例模式与多线程

  单例模式的三个要点:一是某个类只有一个实例,二是它必须自行创建这个实例,三是它必须自行向整个系统提供这个实例。  单例模式在应用中比较常见,比如我们的web系统中service层和dao层的对象就是单例模式,如果控制层采用的是struts的话是多例模式,如果是SpringMVC的话就是单例模式。(这里涉及的是spr...
代码星球·2020-08-27

定时器Timer的使用

  在JDK类库中Timer类主要负责计划任务的功能,也就是在指定的时间开始执行某一个任务。此类也常用来做一下周期性同步工作,代替它的有quartz、SpringTask。Timer类的主要作用是设置计划任务,但封装任务的类是TimerTask类(实际该类是一个抽象类,执行任务的代码要放在该类的子类中)。Timer类的...
代码星球·2020-08-27

Queue和BlockingQueue的使用以及使用BlockingQueue实现生产者-消费者

  Java提供了两种新的容器类型:Queue和BlockingQueue。  Queue用于保存一组等待处理的元素。它提供了几种实现,包括:ConcurrentLinkedQueue,这是一个先进先出的并发对列,以及PriorityQueue,这是一个非并发的优先队列。Queue上的操作不会阻塞,如果队列为空,获取元...

ReentrantReadWriteLock读写锁的使用

  类ReentrantLock具有完全互斥排他的效果,即同一时间只有一个线程在执行ReentrantLock.lock()后面的代码。这样虽然保证了线程的安全性,但是效率低下。JDK提供了ReentrantReadWriteLock读写锁,使用它可以加快效率,在某些不需要操作实例变量的方法中,完全可以使用读写锁Ree...

poi读取Excel模板并修改模板内容与动态的增加行

  有时候我们可能遇到相当复杂的excel,比如表头的合并等操作,一种简单的方式就是直接代码合并(浪费时间),另一种就是写好模板,动态的向模板中增加行和修改指定单元格数据。1.一个简单的根据模板sheet动态修改  原来的excel模板内容如下:  现在的需求是动态的生成生成时间和生成人。并且在第五...

Lock类-ReentrantLock的使用

  在Java多线程中可以使用synchronized隐式锁实现线程之间同步互斥,Java5中提供了Lock类(显示锁)也可以实现线程间的同步,而且在使用上更加方便。本文主要研究ReentrantLock的使用。  公平锁与非公平锁:公平锁表示线程获取锁的顺序是按照线程加锁的顺序来分配的,即先来先得的FIFO顺序。而非...
代码星球·2020-08-27

类ThreadLocal的使用与源码分析

  变量值的共享可以使用publicstatic的形式,所有的线程都使用同一个变量。如果每个线程都有自己的共享变量,就可以使用ThreadLocal。比如Hibernat的session问题就是存在ThreadLoca中。  类ThreadLocal主要解决的就是每个线程绑定自己的值,可以将ThreadLocal比喻成...

方法join()使用详解

  在线程的常见方法一节中,已经接触过join()方法的使用。  在很多情况下,主线程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程将早于子线程结束。这时,如果主线程想等子线程执行完成才结束,比如子线程处理一个数据,主线程想要获得这个数据中的值,就要用到join()方法了。方法join()的作用是等待线程对...
代码星球·2020-08-27