concurrent

JAVA与并发

空扰寡人 提交于 2021-01-19 03:54:16
API 在java1.5之前,java的并发API都是依靠Thread, Runnable, ThreadLocal, ThreadGroup以及Object特有的现成先关方法所构成。此外,还有synchronized, volatile两个关键字对同步和内存一致性的定义。从1.5开始,java的API中多了一个包, java.util.concurrent, 更丰富了并发的API。 本文不是普及知识,所以不对每个API都做详尽的解释,但还是有必要列一张简单的表格。 同步机制 API Java版本 描述 示例 synchronized(obj) { } 1.4 多线程在此代码块必须同步执行 。 线程的interrupt()方法对同步锁上的阻塞是无效的,当线程获取到锁而进入同步块后, 可以调用Thread.interrupted()方法来检验本线程是否被interrupted了。 synchronized(obj) { if (Thread.interrupted()) { // This thread is interrupted. } } Lock since 1.5 替换synchronized。 Lock l = new ReentrantLock(); l.lock(); try { // access the resource protected by this lock

使用CMS垃圾收集器产生的问题和解决方案

耗尽温柔 提交于 2020-04-25 05:35:04
关于CMS垃圾收集器,在 JVM GC参数以及GC算法的应用 中已经提到了。 CMS并行GC是大多数应用的最佳选择,然而, CMS并不是完美的,在使用CMS的过程中会产生2个最让人头痛的问题: promotion failed concurrent mode failure 第一个问题promotion failed是在进行Minor GC时,Survivor Space放不下,对象只能放入老年代,而此时老年代也放不下造成的,多数是由于老年带有足够的空闲空间,但是由于碎片较多,这时如果新生代要转移到老年带的对象比较大,所以,必须 尽可能提早触发老年代的CMS回收 来避免这个问题(promotion failed时老年代CMS还没有机会进行回收,又放不下转移到老年带的对象,因此会出现下一个问题concurrent mode failure,需要stop-the-wold GC- Serail Old)。 下面是一个promotion failed的一条gc日志: 106.641: [GC 106.641: [ParNew (promotion failed): 14784K->14784K(14784K), 0.0370328 secs]106.678: [CMS106.715: [CMS-concurrent-mark: 0.065/0.103 secs] [Times: user

《虚拟机并发编程》读书笔记(一)

痴心易碎 提交于 2020-04-15 14:05:09
【推荐阅读】微服务还能火多久?>>> 出差北京,趁回杭州之前去了趟海淀,顺手带了本之前一直想买的虚拟机并发编程,虽然这本书在 amazon 中国上的评价一般,但看看总还是有些收获吧,可能那些说书一般的都是大神吧。书应该是刚上新的,放在了最显眼的位置。一夜火车,看了前三章觉得不错,还是忍不住写点儿笔记。 书的前言部分推荐了两本书《 Java Concurrency in Practice 》和《 Concurrent Programming in Java 》,这两本书主要对 JDK 提供解决方案,并在内存模型和一致性上进行了比较全面的叙述。而《虚拟机并发编程》则更重于对实际问题的分析和一些经验性的结论。比如这本书会从 IO 密集型与计算密集型等方面对并行程序进行分析。 书主要描述了三种并发的解决方案, java JDK 并发模型,软件事务内存( STM )和基于角色的并发模型( Actor-based )。说来惭愧,这几个中文名词我还真没有听过。书主要分五部分,第一部分还是对并发的概念、应用场合等基础方面进行讲解,这部分通俗易懂,而且选用的实例非常具有代表性。后面几部分即 JDKK 并发模型、 STM 、 Actor-based 和后记。今天这部分主要记录前三章的内容,关于并发策略。 在讲到 Race Condition 的时候,作者用到了一个由于 JIT

GUAVA常用方法总结整理(list map string concurrent file)

无人久伴 提交于 2020-03-19 14:59:33
3 月,跳不动了?>>> 1.对字符串的操作: package com.wenniuwuren.guava; import java.io.UnsupportedEncodingException; import java.util.Date; import java.util.HashMap; import com.google.common.base.CharMatcher; import com.google.common.base.Charsets; import com.google.common.base.Objects; import com.google.common.base.Strings; import com.google.common.collect.ComparisonChain; import sun.org.mozilla.javascript.internal.ast.TryStatement; /** * * @ClassName: WorkingWithStrings * @Description: 对字符串的操作 * @author wenniuwuren * @date 2015-5-20 上午11:33:59 * */ public class WorkingWithStrings { public static void main

GUAVA常用方法总结整理(list map string concurrent file)

纵饮孤独 提交于 2020-03-19 14:30:17
3 月,跳不动了?>>> 1.对字符串的操作: package com.wenniuwuren.guava; import java.io.UnsupportedEncodingException; import java.util.Date; import java.util.HashMap; import com.google.common.base.CharMatcher; import com.google.common.base.Charsets; import com.google.common.base.Objects; import com.google.common.base.Strings; import com.google.common.collect.ComparisonChain; import sun.org.mozilla.javascript.internal.ast.TryStatement; /** * * @ClassName: WorkingWithStrings * @Description: 对字符串的操作 * @author wenniuwuren * @date 2015-5-20 上午11:33:59 * */ public class WorkingWithStrings { public static void main

java concurrent包的学习(转)

若如初见. 提交于 2020-02-29 10:18:56
我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完 成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便。而当针对高质量Java多线程并发程序设计时,为防 止死蹦等现象的出现,比如使用java之前的wait()、notify()和synchronized等,每每需要考虑性能、死锁、公平性、资源管理以 及如何避免线程安全性方面带来的危害等诸多因素,往往会采用一些较为复杂的安全策略,加重了程序员的开发负担.万幸的是,在JDK1.5出现之后,Sun 大神(Doug Lea)终于为我们这些可怜的小程序员推出了java.util.concurrent工具包以简化并发完成。开发者们借助于此,将有效的减少竞争条件 (race conditions)和死锁线程。concurrent包很好的解决了这些问题,为我们提供了更实用的并发程序模型。 Executor :具体Runnable任务的执行者。 ExecutorService :一个线程池管理者,其实现类有多种,我会介绍一部分。我们能把Runnable,Callable提交到池中让其调度。 Semaphore :一个计数信号量 ReentrantLock :一个可重入的互斥锁定 Lock,功能类似synchronized,但要强大的多。 Future :是与Runnable

阅读QtCreator--Concurrent预备知识

Deadly 提交于 2020-01-07 20:50:46
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 在QtCreator当中用到了不少的Concurrent(并发),比如编译时,搜索时等。其实在很多场合中都需要用到,一般是CPU去做一项大任务(花费较长时间)时相应用户操作。另一个重要用途就是在当前这个多核,甚至多CPU的年代,并行变成成为一种时尚了,它也确实提高了应用程序的性能。我的电脑是单CPU,2核心4线程,所以相比单应用程序,应该可以将性能提高将近4倍(当然不会是4倍的)。我所听过的有很多库是这方面的,比如CUDA,OpenCL,OpenMP。Qt是怎么做的还真不知道,望高手指教。首先来测试下: #include <QtCore/QCoreApplication> #include <QtConcurrentRun> #include <QtConcurrentMap> #include <qmath.h> #include <QFuture> #include <QVector> #include <QTime> #include <QObject> #include <QFutureWatcher> #include "myslot.h" QTime t; void test(const int &N) { int k = N * 100; int v = 0; for(int i = 0; i <

LockSupport并发等待基本模型

好久不见. 提交于 2019-12-23 10:11:15
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> LockSupport并发等待基本模型。写的个测试,具体请看注释。 package test; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.LockSupport; /** * @author Wei.Chou(weichou2010@gmail.com) * @version 1.0, 12/08/2016 */ public class ParkTest { private static volatile boolean resulted; private static volatile boolean completed; private static volatile boolean end0; private static volatile boolean end1; private static final AtomicInteger parkCount = new AtomicInteger(0); private static

java的concurrent包的存储类

和自甴很熟 提交于 2019-12-10 03:56:21
java的concurrent包的存储类 简略的翻看一下concurrent包,一部分是通过继承AbstractQueuedSynchronizer实现(ReentrantLock、CountDownLatch、semaphore等),一部分通过lock实现( CycliBarrier、atomic、blockingqueue、concurrentMap等 )。抽象类AbstractQueuedSynchronizer又主要是通过一个自定义的Node的自定义队列来存储线程,然后通过unsafe类(native)来实现指令级别的 compare and swap获取对内存中的共享区域控制权(也就是锁)。然后 unpark、park操作线程的入队、出队(在Node上解释的使用一个FIFO的CLH对列来存放)。现在描述下concurrent中的集合和atomic。 1、atomic 原子量:保证了CPU读、修改、写。但是不保证可见性,数据不知道是刷新到主存还是缓存。包括了:AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference、AtomicStamped、AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray。 atomic变量都是使用 private volatile int

java Concurrent 并发包的使用

雨燕双飞 提交于 2019-12-05 10:31:25
最近在公司里面一直有开发银行对账的需求,但是一直由于项目排期比较的密集,所以该功能已知在推脱。 利用闲余的时间,使用并发包的机制,实现部分的逻辑代码! 先看下对账的业务对象。 package com.concurrent.ule; import java.io.Serializable; public class Reconciliation implements Serializable { private static final long serialVersionUID = 1L; private int payType;//支付类型 private int paySubType;//支付子类型 private float payedAmount;//支付总账 private float refundAmount;//退款总账 private float bankAcceptedAmount; // 银行收账 private float bankRefundAmount;//银行退款 public int getPayType() { return payType; } public void setPayType(int payType) { this.payType = payType; } public int getPaySubType() { return