摘要: 这篇文章是Java并发编程思想系列的第一篇,主要从理解Java并发编程历史的原因和Java并发演进过程两部分,以极简地回溯并发编程的历史,帮助大家从历史这个角度去了解一门语言一个特性的演进。对历史理解的越多,思考的越多,未来的方向就会更加坚定。 阅读全文
posted @ 2020-12-20 18:13 葛一凡 阅读(349) 评论(3) 推荐(1) 编辑
摘要: LockSupport在JDK源码中描述为:构建锁和其他同步类的基本线程阻塞原语,构建更高级别的同步工具集。LockSupport提供的park/unpark从线程的粒度上进行阻塞和唤醒,park/unpark模型真正解耦了线程之间的同步,线程之间不再需要一个Object或者其它变量来存储状态。 阅读全文
posted @ 2017-03-22 12:57 葛一凡 阅读(750) 评论(2) 推荐(0) 编辑
摘要: 工作中经常会遇到争抢共享资源的场景,比如用户抢购秒杀商品,如果不对商品库存进行保护,可能会造成超卖的情况。超卖现象在售卖火车票的场景下更加明显,两个人购买到同一天同一辆列车,相同座位的情况是不允许出现的。交易系统中的退款同样如此,由于网络延迟和重复提交极端时间差的情况下,可能会造成同一个用户重复的退款请求。以上无论是超卖,还是重复退款,都是没有对需要保护的资源或业务进行完善的保护而造成的,从设计方面一定要避免这种情况的发生 阅读全文
posted @ 2017-03-05 18:00 葛一凡 阅读(4608) 评论(3) 推荐(5) 编辑
摘要: synchronized既保证原子性,又保证内存可见性,是一种线程同步的方式,是锁机制的一种java实现。synchronized的实现基于JVM底层,JVM是基于monitor实现的,而monitor的实现依赖于操作系统的互斥实现。 阅读全文
posted @ 2016-12-18 08:24 葛一凡 阅读(1113) 评论(0) 推荐(3) 编辑
摘要: volatile在Java内存模型(JMM)中,保证共享变量对所有线程可见,但不保证原子性。volatile语义是同步,通过共享变量的方式,完成线程间的通信。 阅读全文
posted @ 2016-12-04 22:43 葛一凡 阅读(1378) 评论(3) 推荐(1) 编辑
摘要: 幂等概念来自数学,表示N次变换和1次变换的结果是相同的。这里讨论在某些场景下,客户端在调用服务没有达到预期结果时,会进行多次调用,为避免多次重复的调用对服务资源产生副作用,服务提供者会承诺满足幂等。 阅读全文
posted @ 2016-12-03 12:46 葛一凡 阅读(5708) 评论(3) 推荐(7) 编辑
摘要: synchronized在JDK5之前一直被称为重量级锁,是一个较为鸡肋的设计,而在JDK6对synchronized内在机制进行了大量显著的优化,加入了CAS,轻量级锁和偏向锁的功能,性能上已经跟ReentrantLock相差无几,而且synchronized在使用上更加简单,不易出错(避免哲学家就餐问题造成的死锁),因此如果仅仅是为了实现互斥,而不需要使用基于Lock的附加属性(中断、条件等),推荐优先使用synchronized。 阅读全文
posted @ 2016-11-06 15:39 葛一凡 阅读(437) 评论(0) 推荐(0) 编辑
摘要: ZooKeeper是一个分布式协调服务,它致力去解决如何在分布式环境下保持数据一致性的问题。 阅读全文
posted @ 2015-07-11 20:08 葛一凡 阅读(1314) 评论(0) 推荐(1) 编辑
摘要: FIFO(First In First Out),即先进先出.最先进入的数据,最先出来.一个很简单的算法.只要使用队列数据结构即可实现.那么FIFO淘汰算法基于的思想是"最近刚访问的,将来访问的可能性比较大". 阅读全文
posted @ 2014-07-08 22:15 葛一凡 阅读(1134) 评论(0) 推荐(0) 编辑
摘要: LFU(Least Frequently Used)即最近最不常用.从名字上来分析,这是一个基于访问频率的算法.与LRU不同,LRU是基于时间的,会将时间上最不常访问的数据淘汰;LFU为将频率上最不常访问的数据淘汰. 阅读全文
posted @ 2014-07-06 17:03 葛一凡 阅读(2392) 评论(2) 推荐(4) 编辑