![](https://img-blog.csdnimg.cn/20190918140012416.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
编程语言-java
文章平均质量分 82
java的实战
一 铭
公众号:大数据架构师修行之路
展开
-
Java并发编程--自旋锁的实现和使用(Spin Lock)
自旋锁是这样一类锁:当线程等待加锁时,不会阻塞,不会进入等待状态,而是保持运行状态。大致的思路是:让当前线程不停地的在循环体内执行,当循环的条件被其他线程改变时才能进入临界区。一种实现方式是通过CAS原子操作:设置一个CAS原子共享变量,为该变量设置一个初始化的值;加锁时获取该变量的值和初始化值比较,若相等则加锁成功,让后把该值设置成另外一个值;若不相等,则进入循环(自旋过程),不停的比较该值,直到和初始化值相加锁成功。自旋锁的优势(1)性能较高:自旋锁不会使线程状态切换,始终处于用户态,即线程始终处原创 2021-11-29 19:24:06 · 3133 阅读 · 0 评论 -
java并发编程-Phaser的使用
Phaser介绍在生活中我们会遇到这样的场景:我们把一个任务分成多个阶段来做,每个阶段可以由多人来做,当一个阶段所有人的任务都完成后,才能进入下一个阶段,按这样的方式来完成任务直到任务完成。类似于一个阶段性事务。那么在java编程中如何实现呢?可以通过并发包中的Phaser来模拟实现该场景。Java中的Phaser也是一个同步barrier(屏障),就像CountDownLatch和CyclicBarrier一样,线程需要在barrier处等待,直到所有线程都达到barrier,也就是barrier被原创 2021-03-03 06:47:34 · 458 阅读 · 0 评论 -
java并发编程-CompletableFuture的基本使用
CompletableFuture的基本使用Future的缺陷1.无法手动完成:假设您已经编写了一个函数,用于从远程API获取电子商务产品的最新价格。由于此API调用非常耗时,因此您需要在单独的线程中运行它,并从函数中返回Future。假设远程API服务已关闭,那么您想按产品的最后缓存价格手动完成Future。但通过Future是做不到的。2.在非阻止的情况下,无法对Future的结果执行进一步的操作Future不会将完成通知您。它提供了一个get()方法,该方法将阻塞直到结果可用为止。然而,无原创 2021-03-02 12:39:20 · 487 阅读 · 0 评论 -
java并发编程—并发容器:ConcurrentLinkedQueue的基本原理和使用
概述本文ConcurrentLinkedQueue要点一个基于链接节点(单向链表)的无界线程安全队列,可以并发的进行访问。基于CAS的非阻塞算法实现,它保证了节点操作的原子性。按照FIFO(先进先出)的原则对元素进行排序。队列的头部 是队列中时间最长的元素。队列的尾部 是队列中时间最短的元素。新的元素从队列尾部插入,获取操作从队列头部获得元素。不允许使用 null 元素,这一点和...原创 2019-02-03 14:08:31 · 562 阅读 · 0 评论 -
java并发编程-ConcurrentHashMap的基本原理和使用
概述本文介绍ConcurrentHashMap的原理,并通过例子讲解如何在多线程环境下使用ConcurrentHashMap。ConcurrentHashMap要点与Hastable或synchronizedMap会锁住整个map来保证线程安全,而ConcurrentHashMap允许读线程和写线程的并发地进行操作。 也就是说,ConcurrentHashMap允许同时有一些线程修改map...原创 2019-02-02 16:56:03 · 445 阅读 · 0 评论 -
在idea中创建第一个SpringBean应用
在idea中创建和使用简单的Spring Bean1,创建maven工程在idea中创建一个Maven工程最终的目录组织结构如下:./pom.xml./src./src/main./src/main/java./src/main/java/hover./src/main/java/hover/App.java./src/main/ja原创 2017-05-27 00:02:53 · 4340 阅读 · 1 评论 -
如何跟踪java代码的执行
在C中可以通过strace来跟踪代码,在调试代码是十分方便。在java中,也有对应的工具。这里提供一种用来跟踪java代码执行的方法。 总的来说是两步: (1) 就是通过jmap命令来获取hprof文件 (2) 通过工具来查看该文件的函数调用栈jmap通过该命令捕获镜像,再通过其他命令来查看。生成hprof文件jmap -dump:file=/tmp/heap.hprof $PID查看hpro原创 2017-12-18 14:50:29 · 5983 阅读 · 1 评论 -
单机安装zookeeper集群
单机安装zookeeper集群zookeeper介绍Zookeeper集群主要角色有Leader,Learner(Follower,Observer(当服务器增加到一定程度,由于投票的压力增大从而使得吞吐量降低,所以增加了Observer。)以及client: * Leader:领导者,负责投票的发起和决议,以及更新系统状态 ,注意写操作必须要经过leader同意。 * Follower:接受客原创 2017-12-18 19:44:34 · 1112 阅读 · 0 评论 -
java并发编程-线程池的使用
线程池简介在线程池类ThreadPoolExecutor()源码的注释中写到了设计线程池的原因。线程池主要解决两个问题:一方面当执行大量异步任务时候线程池能够提供较好的性能。这是因为使用线程池可以减少每个任务的调用开销(因为线程池的线程是可复用的)。另一方面线程池提供了一种资源限制和管理的手段。比如当执行一系列任务时候对线程的管理,每个ThreadPoolExecutor也保留了一些基本的统计数原创 2017-12-04 23:16:57 · 685 阅读 · 0 评论 -
java并发编程-同步类容器-ArrayBlockingQueue
BlockingQueue接口介绍java.util.concurrent包中的Java BlockingQueue接口表示一个线程可以安全地插入并从中获取实例的队列。BlockingQueue接口要点支持当队列变为非空时取回元素,也支持当队列有剩余空间时往队列中存放元素。BlockingQueue可能是容量限制的。 在任何给定的时间,它可能具有剩余容量,超过这个容量不能在没有阻塞的情况下放置其原创 2017-09-10 22:31:43 · 722 阅读 · 0 评论 -
java并发编程-线程同步-显示锁ReentrantLock
介绍在java5.0以后添加了一种新的同步机制:Lock接口。ReentrantLock锁被成功获取锁,且没有解锁的线程拥有。原创 2017-09-09 11:21:01 · 871 阅读 · 0 评论 -
java并发编程-PriorityBlockingQueue
PriorityBlockingQueue要点PriorityBlockingQueue类实现了BlockingQueue接口。PriorityBlockingQueue是一个无界并发队列。它使用与java.util.PriorityQueue类相同的排序规则。也就是说,进入该队列的元素会自动排序,在获取该队列的元素时该队列的元素是排好序的。不能在此队列中插入null。虽然此队列在逻辑上是原创 2017-09-16 22:35:59 · 1106 阅读 · 0 评论 -
java并发编程-LinkedBlockingDeque
LinkedBlockingDeque要点该队列是基于双向链表的有界阻塞队列。构造函数的可选参数是容量的界限,用来阻止容量过度扩展的一种方法。也就是说,虽然是双向链表,但也可以指定其容量大小。容量(如果未指定)等于Integer.MAX_VALUE。若节点数量没有到达容量的界限,链接节点在每次插入时都会动态创建。大多数操作在恒定时间运行,异常包括remove,removeFirstOccur原创 2017-09-14 19:21:23 · 1347 阅读 · 0 评论 -
java并发编程-线程同步之synchronized
synchronized的原理和使用synchronized一般语法synchronized (expr) { statements}注意:这里的expr的值必须是某个对象的引用。而当expr表达式为空时,其实是作用在this指针上的。synchronized的原理要是在某个对象上使用synchronized,那么会先获取这个对象的锁,然后执行方法体,最后释放这个对象上的锁。注意:无论原创 2017-09-03 19:31:23 · 772 阅读 · 0 评论