
java并发
文章平均质量分 92
大树叶
宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒。
展开
-
JAVA_TOOL_OPTIONS _JAVA_OPTIONS JAVA_OPTS 那些事
在java编程中,老会碰到JAVA_TOOL_OPTIONS _JAVA_OPTIONS 和 JAVA_OPTS。下面就详细说说他们 JAVA_TOOL_OPTIONS:是标准的,所有虚拟机都能识别和应用的。有些应用不方便设置JVM参数,如命令行应用、通过JNI(Java Native Interface)API调用虚拟机的应用、脚本嵌入虚拟机中的应用等。这种情况环境变量JAVA_TOOL_OPTIONS就非常有用了,它会被JNI API的JNI_CreateJavaVM函数使用。Note:在..原创 2020-09-02 23:12:37 · 5085 阅读 · 0 评论 -
如何写通用的Java hashCode
Google首席Java架构师Joshua Bloch在他的著作《Effective Java》中提出了一种简单通用的hashCode算法1. 初始化一个整形变量,为此变量赋予一个非零的常数值,比如int result = 17;2. 选取equals方法中用于比较的所有域,然后针对每个域的属性进行计算: (1) 如果是boolean值,则计算f ? 1:0 (2) 如果是by...原创 2020-02-05 00:28:39 · 690 阅读 · 0 评论 -
Spring @Value 用法
1. 概述在 Spring 组件中使用 @Value 注解的方式,很方便的读取 properties 文件的配置值。2.使用场景声明的变量中使用。public static class FieldValueTestBean { @Value("#{ systemProperties['user.region'] }") private String defaul...转载 2018-07-18 14:47:43 · 8760 阅读 · 0 评论 -
LinkedBlockingQueue 实现 生产者 消费者
Java中使用LinkedBlockingQueue实现生产者,消费者模式LinkedBlockingQueue实现是线程安全的,实现了FIFO(先进先出)等特性. 是作为生产者消费者的首选,LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的话,默认最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在队列满的时候会阻塞直到有队列成员被消...转载 2018-03-21 16:52:38 · 3002 阅读 · 0 评论 -
推荐读:JVM底层是如何实现synchronized的
目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea。本文只是介绍二者的实现原理。数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖特殊的CPU指令,大家可能会进一步追问:JVM底层又是如何实现synchroniz...原创 2017-06-13 10:45:41 · 623 阅读 · 0 评论 -
推荐:Zookeeper 开源客户端框架Curator简介
Curator是Netflix开源的一套ZooKeeper客户端框架. Netflix在使用ZooKeeper的过程中发现ZooKeeper自带的客户端太底层, 应用方在使用的时候需要自己处理很多事情, 于是在它的基础上包装了一下, 提供了一套更好用的客户端框架. Netflix在用ZooKeeper的过程中遇到的问题, 我们也遇到了, 所以开始研究一下, 首先从他在github上的源码, w转载 2017-08-13 01:01:32 · 573 阅读 · 0 评论 -
Java 并发编程:volatile的使用及其原理
一、volatile的作用 在《Java并发编程:核心理论》一文中,我们已经提到过可见性、有序性及原子性问题,通常情况下我们可以通过Synchronized关键字来解决这些个问题,不过如果对Synchronized原理有了解的话,应该知道Synchronized是一个比较重量级的操作,对系统的性能有比较大的影响,所以,如果有其他解决方案,我们通常都避免使用Synchronized来解决问转载 2017-06-14 01:02:21 · 246 阅读 · 0 评论 -
Java并发编程:Synchronized底层优化(偏向锁、轻量级锁)
一、重量级锁 上篇文章中向大家介绍了Synchronized的用法及其实现的原理。现在我们应该知道,Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么Synchron转载 2017-06-14 00:59:31 · 432 阅读 · 0 评论 -
Java并发编程实战 AQS(四):CLH同步队列
在【Java并发编程实战】—–“J.U.C”:CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形。其主要从两方面进行了改造:节点的结构与节点等待机制。在结构上引入了头结点和尾节点,他们分别指向队列的头和尾,尝试获取锁、入队列、释放锁等实现都与头尾节点相关,并且每个节点都引入前驱节点和后后续节点的引用;在等待机制上由原来的自旋改成阻塞唤醒。其结构如下:知道其结构了,我们转载 2017-06-13 23:27:02 · 409 阅读 · 0 评论 -
Java并发编程 AQS(三):阻塞、唤醒:LockSupport
在上篇博客Java并发编程 AQS(二):获取锁、释放锁 中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起;在释放锁后,需要唤醒该线程的继任节点lock方法,在调用acquireQueued():[java] view plain copyif (shouldParkAfterFailedAcquire(p,转载 2017-06-13 23:24:20 · 450 阅读 · 0 评论 -
Java并发编程 AQS分析(二):获取锁、释放锁
上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放。AQS锁获取AQS包含如下几个方法:acquire(int arg):以独占模式获取对象,忽略中断。acquireInterruptibly(int arg): 以独占模式获取对象,如果被中断则中止。acquireShared(int arg): 以共享模式获取对象,忽略中断。ac转载 2017-06-13 23:21:47 · 695 阅读 · 0 评论 -
JAVA并发编程: AQS获取与释放
同步状态AQS采用的是CLH队列,CLH队列是由一个一个结点构成的,前面提到结点中有一个状态位,这个状态位与线程状态密切相关,这个状态位(waitStatus)是一个32位的整型常量,它的取值如下:[java] view plain copy print?static final int CANCELLED = 1; stat转载 2017-06-13 23:15:43 · 309 阅读 · 0 评论 -
Java的LockSupport.park()实现分析
LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语。LockSupport实际上是调用了Unsafe类里的函数,归结到Unsafe里,只有两个函数:[java] view plain copypublic native void unpark(Thread jthread); publ转载 2017-06-13 23:10:51 · 381 阅读 · 0 评论 -
java并发编程: Synchronized与ReentrantLock的区别
Java在编写多线程程序时,为了保证线程安全,需要对数据同步,经常用到两种同步方式就是Synchronized和重入锁ReentrantLock。相似点: 这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式的同步,也就是说当如果一个线程获得了对象锁,进入了同步块,其他访问该同步块的线程都必须阻塞在同步块外面等待,而进行线程阻塞和唤醒的代价是比较高的(操作转载 2017-06-13 10:32:07 · 632 阅读 · 0 评论 -
Java并发编程- Lock和condition的实现细节 AQS(推荐读)
AQS的全称为(AbstractQueuedSynchronizer),这个类也是在Java.util.concurrent.locks下面。这个类似乎很不容易看懂,因为它仅仅是提供了一系列公共的方法,让子类来调用。那么要理解意思,就得从子类下手,反过来看才容易看懂。如下图所示:图 5-15 AQS的子类实现这么多类,我们看那一个?刚刚提到过锁(Lock),我们就从锁开转载 2017-06-13 10:27:51 · 980 阅读 · 0 评论