上一页 1 2 3 4 5 6 ··· 16 下一页
摘要: 【死磕 Java 并发】系列是 LZ 在 2017 年写的第一个死磕系列,一直没有做一个合集,这篇博客则是将整个系列做一个概览。 先来一个总览图: 【高清图,请关注“Java技术驿站”公众号,回复:脑图JUC】 【死磕Java并发】—–深入分析synchronized 的实现原理 synchroni 阅读全文
posted @ 2018-08-29 17:39 chenssy 阅读(5120) 评论(1) 推荐(4) 编辑
摘要: 在上篇博客(【死磕Java并发】—–深入分析volatile的实现原理)LZ提到过由于存在线程本地内存和主内存的原因,再加上重排序,会导致多线程环境下存在可见性的问题。那么我们正确使用同步、锁的情况下,线程A修改了变量a何时对线程B可见? 我们无法就所有场景来规定某个线程修改的变量何时对其他线程可见 阅读全文
posted @ 2017-02-13 13:08 chenssy 阅读(47019) 评论(4) 推荐(12) 编辑
摘要: 通过前面一章我们了解了synchronized是一个重量级的锁,虽然JVM对它做了很多优化,而下面介绍的volatile则是轻量级的synchronized。如果一个变量使用volatile,则它比使用synchronized的成本更加低,因为它不会引起线程上下文的切换和调度。Java语言规范对vo 阅读全文
posted @ 2017-02-08 17:46 chenssy 阅读(27805) 评论(6) 推荐(8) 编辑
摘要: 我们知道Spring的IoC起到了一个容器的作用,其中装得都是各种各样的Bean。同时在我们刚刚开始学习Spring的时候都是通过xml文件来定义Bean,Spring会某种方式加载这些xml文件,然后根据这些信息绑定整个系统的对象,最终组装成一个可用的基于轻量级容器的应用系统。 Spring Io 阅读全文
posted @ 2016-06-27 09:09 chenssy 阅读(6166) 评论(4) 推荐(4) 编辑
摘要: 首先我们先来看看如下一段代码 ClassPathResource resource = new ClassPathResource("bean.xml"); DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader... 阅读全文
posted @ 2016-06-12 16:21 chenssy 阅读(3789) 评论(0) 推荐(0) 编辑
摘要: 2015年进步很小,看的书也不是很多,感觉自己都要废了,2016是沉淀的一年,在这一年中要不断学习、看书,努力提升自己!预计在2016年要看12本书,主要涉及java基础、Spring研究、java并发、JVM、分布式之类的。在今年面试的时候深受打击,到处都是问分布式、集群的?难道现在工作两三年的都这么牛逼了?都在搞分布式、集群之类的? 2016书单如下: 1、深入理解Java虚拟机:JVM高... 阅读全文
posted @ 2016-05-04 08:53 chenssy 阅读(11416) 评论(27) 推荐(28) 编辑
摘要: IOC:Inversion of Control(控制反转)。IOC它所体现的并不是一种技术,而是一种思想,一种将设计好的对象交给容器来管理的思想。IOC的核心思想就体现在控制、反转这两个词上面,要理解就必须要理解几个问题: 1、谁控制谁?在传统的开发工作中,我们一般都是主动去new一个对象,这个是主动控制依赖对象。但是对于IOC而已,控制权会被移交给容器,所以应该是IOC容器控制对象。 2、... 阅读全文
posted @ 2016-01-06 17:50 chenssy 阅读(5120) 评论(3) 推荐(5) 编辑
摘要: 在【Java并发编程实战】—–“J.U.C”:CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形。其主要从两方面进行了改造:节点的结构与节点等待机制。在结构上引入了头结点和尾节点,他们分别指向队列的头和尾,尝试获取锁、入队列、释放锁等实现都与头尾节点相关,并且每个节点都引入前驱节点和后后续节点的引用;在等待机制上由原来的自旋改成阻塞唤醒。其结构如下: 知道其结构了,我们再看看他... 阅读全文
posted @ 2015-12-30 08:24 chenssy 阅读(11667) 评论(2) 推荐(4) 编辑
摘要: 在上篇博客(【Java并发编程实战】----- AQS(二):获取锁、释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起;在释放锁后,需要唤醒该线程的继任节点 lock方法,在调用acquireQueued(): if (shouldParkAfterFailedAcquire(p, node) && par... 阅读全文
posted @ 2015-12-27 11:22 chenssy 阅读(3699) 评论(0) 推荐(0) 编辑
摘要: 上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放。 AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断。 acquireInterruptibly(int arg): 以独占模式获取对象,如果被中断则中止。 acquireShared(int arg): 以共享模式获取对象,忽略中断。 acquireSharedI... 阅读全文
posted @ 2015-12-24 17:47 chenssy 阅读(6459) 评论(0) 推荐(2) 编辑
摘要: 在前面博客中,LZ讲到了ReentrantLock、ReentrantReadWriteLock、Semaphore、CountDownLatch,他们都有各自获取锁的方法,同时相对于Java的内置锁,他们具有明显的优势:花最小的空间开销创建锁、最少的时间开销获得锁、使用更加方便灵活。 参考Java的内置锁,对于JUC同步器而言,他应该具备两个最基本的功能:获取锁,释放锁。其中获取锁应该是先判断... 阅读全文
posted @ 2015-12-17 17:43 chenssy 阅读(11239) 评论(0) 推荐(5) 编辑
摘要: 在前面介绍的几篇博客中总是提到CLH队列,在AQS中CLH队列是维护一组线程的严格按照FIFO的队列。他能够确保无饥饿,严格的先来先服务的公平性。下图是CLH队列节点的示意图: 在CLH队列的节点QNode中包含有一个locked的字段,该字段表示该节点是否需要获取锁,为true表示需要获取,为false表示不需要获取。在CLH队列中,节点与节点之间并不是通过next指针来连接的而是通过my... 阅读全文
posted @ 2015-12-10 09:40 chenssy 阅读(5745) 评论(0) 推荐(0) 编辑
摘要: CAS,即Compare and Swap,中文翻译为“比较并交换”。 对于JUC包中,CAS理论是实现整个java并发包的基石。从整体来看,concurrent包的实现示意图如下: i++是一个非常经典的操作,它几乎充斥着我们每个人编写的代码中。我们知道i++是可以分解的,它分解为getI()、i + 1 、setI三个步骤,所以它并不是原子操作。如果i==1,执行两次i++操作,我们期... 阅读全文
posted @ 2015-12-07 09:18 chenssy 阅读(2374) 评论(2) 推荐(4) 编辑
摘要: 前面介绍了三个同步辅助类:CyclicBarrier、Barrier、Phaser,这篇博客介绍最后一个:Exchanger。JDK API是这样介绍的:可以在对中对元素进行配对和交换的线程的同步点。每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象。Exchanger 可能被视为 SynchronousQueue 的双向形式。Exchang... 阅读全文
posted @ 2015-11-30 09:07 chenssy 阅读(1855) 评论(0) 推荐(1) 编辑
摘要: Phaser由java7中推出,是Java SE 7中新增的一个使用同步工具,在功能上面它与CyclicBarrier、CountDownLatch有些重叠,但是它提供了更加灵活、强大的用法。 CyclicBarrier,允许一组线程互相等待,直到到达某个公共屏障点。它提供的await()可以实现让所有参与者在临界点到来之前一直处于等待状态。 CountDownLatch,在完成一组正在其他线... 阅读全文
posted @ 2015-11-23 20:08 chenssy 阅读(5681) 评论(4) 推荐(0) 编辑
上一页 1 2 3 4 5 6 ··· 16 下一页