回望2017

2016的总结依稀还是昨天,2018已经悄悄地走来。这一年我做了哪些?加入了一个大平台,跨进了忙碌的工作状态,缺少了思考,缺少了对家人的关注,站在2018年门前回望发现自己失去了很多。

阅读全文

理解条件等待Condition

Condtion也被称为条件队列(condition queues)或者条件变量(condition variables),是利用线程间共享的全局变量进行同步的一种机制。主要包括两个动作:一个线程等待“条件谓词成立”而挂起;另一个线程使“条件谓词成立”,发出条件成立信号。由于对共享状态信息的访问发生在多线程中,因此条件变量的使用是需要结合锁机制的(一般是互斥锁)。也就是说,一个线程要等到临界区的共享数据达到某种状态时再进行某种操作,而这个状态的成立,则是由另外一个线程来完成后发送信号来通知的。

阅读全文

使用分布式锁时考虑哪些问题

工作中经常会遇到争抢共享资源的场景,比如用户抢购秒杀商品,如果不对商品库存进行保护,可能会造成超卖的情况。超卖现象在售卖火车票的场景下更加明显,两个人购买到同一天同一辆列车,相同座位的情况是不允许出现的。交易系统中的退款同样如此,由于网络延迟和重复提交极端时间差的情况下,可能会造成同一个用户重复的退款请求。以上无论是超卖,还是重复退款,都是没有对需要保护的资源或业务进行完善的保护而造成的,从设计方面一定要避免这种情况的发生。

阅读全文

2016拾遗

2016年就要过去了,我很怀念她。2015年7月加入了一家创业公司,被激情牵动,被希望点燃。已经过去半年多时间,为什么曾经激动的心情这么快就平复?而多了一些对过去无知的感叹,对未来憧憬的向往,庆幸有一群关系甚好的朋友一直陪伴,一直在包容我的激进和不足。感恩,感谢,感激。

阅读全文

Btrace入门

在生产环境中可能经常遇到各种问题,排查定位问题需要当时程序运行的更多信息,如方法参数、返回值、全局变量、堆栈信息等,不可能在开发的时候就把程序中所有的运行细节都打印到日志上,通过的做法是修改代码,增加日志信息的打印,部署到生产环境再观察。但是这种方式的问题很明显:一方面将增大定位问题的成本和周期,对于紧急问题无法做到及时响应;另一方面重新部署后环境可能已被破坏,很难重新问题的场景。

阅读全文

更加灵活的Lock

Lock是一把相对于更加灵活的锁。灵活之处在于提供了超时、可中断的获取锁方式,把这种自由度交给用户控制;与synchronized不同,Java内置锁就像一个大包大揽的家长,把获取、释放锁都自己处理了。依然保持上文中的观点:如果仅仅是为了实现互斥,而不需要使用基于Lock的附加属性(中断、条件等),推荐优先使用synchronized。

阅读全文