
Java并发
文章平均质量分 86
Java并发编程包括Java内存模型、锁、并发容器和框架、原子操作类、并发工具类、线程池等内容。
RB_VER
这个作者很懒,什么都没留下…
展开
-
Executor框架
本文参考https://thinkwon.blog.youkuaiyun.com/article/details/102541990Java的线程既是工作单元,也是执行机制。从JDK 5开始,把工作单元与执行机制分离开来。工作单元包括Runnable和Callable,而执行机制由Executor框架提供。Executor框架简介Executor框架的两级调度模型在HotSpot VM的线程模型中,Java线程(java.lang.Thread)被一对一映射为本地操作系统线程。Java线程启动时会创建一个本.原创 2021-06-23 10:11:00 · 179 阅读 · 0 评论 -
Java中的线程池
Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。降低资源消耗。通过复用已创建的线程降低线程创建和销毁造成的消耗。提升系统响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。线程池的实现原理当向线程池提交一个任务之后,线程池的处理流程图如下:从图中可原创 2021-06-22 16:11:10 · 103 阅读 · 0 评论 -
并发工具Semaphore与Exchanger
SemaphoreSemaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。Semaphore可以用作流量控制,特别是公用资源有限的应用场景,比如数据库连接。Semaphore的用法很简单,首先线程使用Semaphore的acquire()方法获取一个许可证,使用完之后调用release()方法归还许可证。还可以用tryAcquire()方法尝试获取许可证。Semaphore的构造方法Semaphore(int permits)接受一个整型数字,原创 2021-06-22 10:39:04 · 130 阅读 · 0 评论 -
并发工具类CountDownLatch与CyclicBarrier
CountDownLatch在多线程协作完成业务功能时,有时候需要等待其他多个线程完成任务之后,主线程才能继续往下执行业务功能,在这种的业务场景下,通常可以使用Thread类的join方法,让主线程等待被join的线程执行完之后,主线程才能继续往下执行。当然,使用线程间消息通信机制也可以完成。其实,Java并发工具类中为我们提供了类似“倒计时”这样的工具类,可以十分方便的完成所说的这种业务场景。为了能够理解CountDownLatch,举一个很通俗的例子,运动员进行跑步比赛时,假设有6个运动员参与比赛,转载 2021-06-22 09:48:20 · 157 阅读 · 0 评论 -
原子操作类
Java中java.util.concurrent.atomic包中的原子操作类提供了一种用法简单、性能高效、线程安全地更新一个变量的方式。因为变量的类型有很多种,所以在Atomic包里一共提供了13个类,属于4种类型的原子更新方式,分别是原子更新基本类型、原子更新数组、原子更新引用和原子更新属性(字段)。Atomic包里的类基本都是使用Unsafe实现的包装类。原子更新基本类型类使用原子的方式更新基本类型,Atomic包提供了以下3个类。AtomicBoolean:原子更新布尔类型。Atomi原创 2021-06-22 09:01:32 · 139 阅读 · 0 评论 -
ThreadLocal详解
ThreadLocal的简介在多线程编程中通常解决线程安全的问题我们会利用synchronzed或者lock控制线程对临界区资源的同步顺序从而解决线程安全的问题,但是这种加锁的方式会让未获取到锁的线程进行阻塞等待,很显然这种方式的时间效率并不是很好。线程安全问题的核心在于多个线程会对同一个临界区共享资源进行操作,那么,如果每个线程都使用自己的“共享资源”,各自使用各自的,又互相不影响到彼此即让多个线程间达到隔离的状态,这样就不会出现线程安全的问题。事实上,这就是一种“空间换时间”的方案,每个线程都会都拥有转载 2021-06-21 16:53:07 · 638 阅读 · 0 评论 -
阻塞队列BlockingQueue
阻塞队列简介在实际编程中,会经常使用到JDK中Collection集合框架中的各种容器类如实现List,Map,Queue接口的容器类,但是这些容器类基本上不是线程安全的,除了使用Collections可以将其转换为线程安全的容器,Doug Lea大师为我们都准备了对应的线程安全的容器,如实现List接口的CopyOnWriteArrayList,实现Map接口的ConcurrentHashMap,实现Queue接口的ConcurrentLinkedQueue。最常用的"生产者-消费者"问题中,队列通常转载 2021-06-21 16:06:05 · 282 阅读 · 0 评论 -
并发容器之ConcurrentHashMap详解(JDK1.8版本)与源码分析
ConcurrentHashMap是线程安全且高效的HashMap。HashMap是线程不安全的:多线程会导致HashMap的Entry链表形成环形数据结构,一旦形成环形数据结构,Entry的next节点永远不为空,就会产生死循环获取Entry。HashTable是效率低下:HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下。因为当一个线程访问HashTable的同步方法,其他线程也访问HashTable的同步方法时,会进入阻塞或轮转载 2021-06-21 15:11:35 · 424 阅读 · 0 评论 -
Condition接口
任意一个Java对象,都拥有一组监视器方法(定义在java.lang.Object上),主要包括wait()、wait(long timeout)、notify()以及notifyAll()方法,这些方法与synchronized同步关键字配合,可以实现等待/通知模式。Condition接口也提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式。Object的监视器方法与Condition接口的对比对比项Object Monitor MethodsCondition原创 2021-06-21 09:12:50 · 96 阅读 · 0 评论 -
重入锁与读写锁
重入锁重入锁ReentrantLock就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。除此之外,该锁还支持获取锁时的公平和非公平性选择。synchronized关键字隐式的支持重进入,比如一个synchronized修饰的递归方法,在方法执行时,执行线程在获取了锁之后仍能连续多次地获得该锁。ReentrantLock虽然没能像synchronized关键字一样支持隐式的重进入,但是在调用lock方法时,已经获取到锁的线程,能够再次调用lock()方法获取锁而不是被阻塞。这里提到一个锁原创 2021-06-21 08:20:30 · 404 阅读 · 0 评论 -
Lock接口与队列同步器
Lock接口锁是用来控制多个线程访问共享资源的方式。在Lock接口出现之前,Java程序是靠synchronized关键字实现锁功能,在Java SE5之后,并发包新增了Lock接口以及相关实现类用来实现锁功能,它提供了与synchronized关键字类似的同步功能,只是在使用时需要显示地获取和释放锁。使用synchronized关键字会隐式地获取锁,但它将锁的获取和释放固化了。Lock的使用方式:Lock lock = new ReentrantLock();lock.lock();try {原创 2021-06-20 10:24:03 · 183 阅读 · 0 评论 -
一个简单的数据库连接池实现
等待超时模式调用一个方法时等待一段时间,如果该方法能够在给定的时间段之内得到结果,那么将结果立刻返回,反之,超时返回默认结果。假设超时时间段是T,那么可以推断出在当前时间now+T之后就会超时。定义如下变量:等待持续时间:REMAINING=T。超时时间:FUTURE=now+T。这时仅需要wait(REMAINING)即可,在wait(REMAINING)返回之后会将执行:REMAINING=FUTURE-now。如果REMAINING小于等于0,表示已经超时,直接退出,否则将继续执行wa原创 2021-06-19 07:52:15 · 278 阅读 · 0 评论 -
线程间通信
volatile和synchronized关键字Java支持多个线程同时访问一个对象或者对象的成员变量,由于每个线程可以拥有这个变量的拷贝(虽然对象以及成员变量分配的内存是在共享内存中的,但是每个执行的线程还是可以拥有一份拷贝,这样做的目的是加速程序的执行,这是现代多核处理器的一个显著特性),所以程序在执行过程中,一个线程看到的变量并不一定是最新的。关键字volatile可以用来修饰字段(成员变量),就是告知程序任何对该变量的访问均需要从共享内存中获取,而对它的改变必须同步刷新回共享内存,它能保证所有线原创 2021-06-18 14:53:06 · 77 阅读 · 0 评论 -
Java中线程优先级、线程的状态以及启动和终止线程
线程概念:现代操作系统调度的最小单元是线程,也叫轻量级进程(Light Weight Process),在一个进程中可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。处理器在这些线程上高速切换。线程优先级现代操作系统基本采用时分的形式调度运行的线程。线程分配到的时间片多少也就决定了使用处理器资源多少,而线程优先级就是决定线程需要多或少分配一些处理器资源的线程属性。在Java线程中,通过一个整型成员变量priority来控制优先级,优先级范围从1~10,在线原创 2021-06-18 10:56:57 · 329 阅读 · 1 评论 -
Java内存模型
volatilevolatile在多处理器开发中保证了共享变量的“可见性”。可见性是指当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。volatile比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。volatile的底层实现:有volatile变量修饰的共享变量进行写操作的时候会用到Lock前缀的指令。Lock前缀的指令在多核处理器下会引发两件事情:原创 2021-06-17 15:29:15 · 140 阅读 · 1 评论