
java多线程与并发
心猿意碼
用心记录
展开
-
java线程间通信
在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作。比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去。因此,一般情况下,当队列满时,会让生产者交出对临界...原创 2019-04-10 13:39:44 · 19594 阅读 · 0 评论 -
java-Semaphore信号量的使用
一、Semaphore概念Semaphore也叫信号量,在JDK1.5被引入,可以用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用资源。Semaphore内部主要通过AQS(AbstractQueuedSynchronizer)实现线程的管理。Semaphore有两个构造函数,参数permits表示许可数,它最后传递给了AQS的state值。线程在运行时首先获取许可,如果...原创 2019-04-17 18:14:04 · 15830 阅读 · 0 评论 -
java-同步工具类CyclicBarrier
一、概念栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生。栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行。闭锁用于等待事件,而栅栏用于等待其他线程。CyclicBarrier可以使一定数量的线程反复地在栅栏位置处汇集。当线程到达栅栏位置时将调用await方法,这个方法将阻塞直到所有线程都到达栅栏位置。如果所有线程都到达栅栏位置,那么栅栏将打开,此时所有的线程都将被...原创 2019-04-18 10:54:15 · 14408 阅读 · 0 评论 -
java-同步工具类CountDownLatch
目录一、CountDownLatch概念二、CountDownLatch实现1、构造函数2、countDown方法3、await方法三、应用一、CountDownLatch概念CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier、Semaphore、ConcurrentHashMap和Blockin...原创 2019-04-18 11:21:14 · 14523 阅读 · 0 评论 -
java-同步工具类Exchanger
一、概述用于线程间数据的交换。它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据,如果第一个线程先执行exchange()方法,它会一直等待第二个线程也执行exchange方法,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。此类有几个特点:此类提供对外的操作是同步的;用于成对出现的线程之间交...原创 2019-04-18 13:02:42 · 14364 阅读 · 0 评论 -
java-阻塞队列BlockingQueue
一、概述队列:先进先出。包含固定长度队列和不固定长度队列什么是可阻塞队列:队列满了添加线程会阻塞等待,队列空了获取线程也会阻塞等待。非阻塞队列则会直接报错。BlockingQueue支持两个附加操作的Queue:1)当Queue为空时,获取元素线程被阻塞直到Queue变为非空;2)当Queue满时,添加元素线程被阻塞直到Queue不满。BlockingQueue不允许元素为null,如...原创 2019-04-18 14:11:30 · 14689 阅读 · 0 评论 -
java-同步集合Concurrent Collections应用
一、传统集合的缺陷传统的集合,在并发访问的时候,是有问题的。如hashset、hashmap和arrayList,多个线程在对他们取数据、放数据的时候,是有问题的,因为他们是线程不安全的。由于没有控制并发,会导致数据的不一致,引起死循环。为什么会引起死循环?拿HashMap来看,看一下HashMap的get函数的源代码:public V get(Object key){i...原创 2019-04-18 17:53:30 · 13976 阅读 · 0 评论 -
多线程在CPU上是怎样分布的
关于Java多线程在CPU上分布的问题,首先要明白一点,它与CPU是多核还是双核并没有必然的联系。CPU有时只能执行一个线程,这是因为在多线程并行执行时,CPU可以根据一定的算法来调度和切换线程。一般而言对于多线程的理解可以是CPU根据一定的线程调度算法来切换线程,因此在相应时段,可看作是多个线程在并发执行。但在某一时间点上实际运行的只有一个线程。在Java多线程中有并发编程和CPU时钟...转载 2019-07-09 16:29:02 · 4544 阅读 · 0 评论 -
为什么wait()和notify()需要搭配synchonized关键字使用
##理解此问题先修知识:synchronized 的含义:Java中每一个对象都可以成为一个监视器(Monitor), 该Monitor由一个锁(lock), 一个等待队列(waiting queue ), 一个入口队列( entry queue).对于一个对象的方法, 如果没有synchronized关键字, 该方法可以被任意数量的线程,在任意时刻调用。对于添加了synchroniz...转载 2019-07-10 09:25:55 · 2758 阅读 · 0 评论 -
java线程的中断机制interrupt
概述之前讲解Thread类中方法的时候,interrupt()、interrupted()、isInterrupted()三个方法没有讲得很清楚,只是提了一下。现在把这三个方法同一放到这里来讲,因为这三个方法都涉及到多线程的一个知识点----中断机制。Java没有提供一种安全、直接的方法来停止某个线程,而是提供了中断机制。中断机制是一种协作机制,也就是说通过中断并不能直接终止另一个线程,而...转载 2019-07-10 10:32:57 · 3111 阅读 · 0 评论 -
Java中的volatile
内存可见性留意复合类操作解决num++操作的原子性问题禁止指令重排序总结内存可见性 volatile是Java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色。同synchronized相比(synchronized通常称为重量级锁),volatile更轻量级,相比使用synchronized所带来的庞大开销,倘若能恰当的合理的使用volatile,自然...转载 2019-07-10 12:39:37 · 1412 阅读 · 0 评论 -
java多线程之Condition的使用
目录一、Condition的概念二、Condition的实现分析(1)等待(2)通知三、Condition应用(1)简单demo(2)可阻塞队列的应用案例(3)多线程轮流执行一、Condition的概念回忆 synchronized 关键字,它配合 Object 的 wait()、notify() 系列方法可以实现等待/通知模式。对于 Lock,通过...原创 2019-04-17 16:49:23 · 16529 阅读 · 0 评论 -
java线程的互斥
多线程程序中的各个线程都是自由运行的,所以它们有时就会同时操作同一个实例。这在某些情况下会引发问题。例如,从银行账户取款时,余额确认部分的代码应该是像下面这样的。 if (可用余额大于取款金额) { 从可用余额中减掉取款金额 } 首先确认可用余额,确认是否允许取款。如果允许,则从可用余额上减掉取款金额。这样才不会导致可用余额变为负数。但是,如果两个线程同时执行...原创 2019-04-10 07:47:54 · 21217 阅读 · 0 评论 -
java线程范围内的共享数据
线程范围内共享数据的作用和目的:线程范围内的共享变量就是在一个相同的线程内部,不同的模块可以对相同的数据进行操作,但是另一个线程对同一个数据进行操作并不影响本线程。其实就是实现两(多)个线程内部对数据实现共享,线程之间(线程外部)相互独立。全局变量会被所有的线程都共享,现在需要实现同一个线程内不同模块间变量的共享,关于线程范围内的变量共享的举例,直接用程序代码进行时说明,创建两个线程,...原创 2019-04-10 14:57:37 · 19674 阅读 · 0 评论 -
java--ThreadLocal实现线程范围的共享变量
对ThreadLocal的理解ThreadLocal类就相当于一个Map,用于实现线程内的数据共享,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另外线程中运行时又共享另外一份数据。每个线程调用全局ThreadLocal对象的set方法,就相当于往其内部的map中增加一条记录,key分别是各自的线程,value是各自的set方法传进去的值。在线程结束时可以调用Thr...原创 2019-04-10 17:24:53 · 20509 阅读 · 0 评论 -
java多个线程访问共享对象和数据的方式
一、如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,买票系统就可以这么做:import java.time.Year;import java.util.concurrent.SynchronousQueue;import org.omg.CORBA.PRIVATE_MEMBER;public class ThreadD...原创 2019-04-11 14:35:54 · 20340 阅读 · 0 评论 -
java多线程并发-原子性操作类的应用
在java5以后,我们接触到了线程原子性操作,也就是在修改时我们只需要保证它的那个瞬间是安全的即可,经过相应的包装后可以再处理对象的并发修改,本文总结一下Atomic系列的类的使用方法,其中包含:基本类型 AtomicInteger AtomicLong AtomicBoolean数组类型 AtomicIntegerArray AtomicLongArray...原创 2019-04-11 15:47:22 · 19757 阅读 · 0 评论 -
java并发-ReentrantReadWriteLock读写锁
一、概念Java常见的多是排他锁,这些锁在同一时刻只允许一个线程进行访问,而读写锁在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞。读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大提升,读写锁能有效提高读比写多的场景下的程序性能,比排它锁好。Lock比传统线程模型中的synchronized方式更加面向对象...原创 2019-04-15 17:13:01 · 17108 阅读 · 0 评论 -
线程和进程的概念
现在的操作系统是多任务操作系统。多线程是实现多任务的一种方式。进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中,一个运行的exe就是一个进程。现代操作系统在运行一个程序时, 会为其创建一个进程。 例如, 启动一个Java程序, 操作系统就会创建一个Java进程。 现代操作系统调度的最小单元是线程, 也叫轻量级进程(...原创 2019-04-09 07:54:08 · 19799 阅读 · 0 评论 -
创建线程的两种传统方式
1. 在Thread子类覆盖的run方法中编写运行代码Thread thread = new Thread() { @Override public void run() { //希望代码长期运行下去就编写在一个循环里面 while (true) { try { //线程睡眠 Thread.sleep(500); } c...原创 2019-04-09 08:43:34 · 19797 阅读 · 0 评论 -
Java线程池的使用
线程池的概念我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?在Java中可以通过线程池来达到这样的效果:(...原创 2019-04-12 13:28:41 · 18707 阅读 · 0 评论 -
java-Callable与Future的应用
目录一、引言二、Callable与Runnable三.Future三、Callable与Runnable应用四、FutureTask五、CompletionService一、引言在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。如果需要获取...原创 2019-04-12 16:57:03 · 22083 阅读 · 0 评论 -
java定时器
1、在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等。对于这样的操作最方便、高效的实现方式就是使用java.util.Timer工具类。2、Timer定时方法(1)Timer.schedule(TimerTask task,Date time)安排在制定的时间执行指定的任务。(2)Timer.schedule(TimerTask task,Date firstTime...原创 2019-04-09 18:37:50 · 19750 阅读 · 0 评论 -
AtomicInteger保证线程安全的全局变量
现有业务场景需要做一个线程间的全局变量,并且实现自增效果。 初始使用了volatile 来保证count的安全性,如下:import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;public cl...转载 2019-07-10 13:14:06 · 1917 阅读 · 0 评论