Menu Sidebar
Menu

Others

CAS (Compare-and-Swap) 以及相关问题

CAS (Compare-and-Swap) 是一种硬件上, 实现非锁同步的一种方法. 这种方法比传统的blocked方法在硬件上实现, 效率高而且内存命中率高. CAS实现的是一种先验的赋值方法, 即: 给出一个当前值v, 当想改变这个当前值的时候, 一个线程需要进行先验操作, 以当前线程为观察者, 查看改变对象是否是当前线程中期待的对象的值. 如果是才去改变它.  整个行为并非通过锁住线程实现的, 而在硬件上, 访问一个内存片段上的速度远远快于在更高层锁住当前线程的速度. 所以CAS被认为是比所要快速的实现原子化操作的方法之一.CAS 和 CAS2 被用在了Java自带的AtomicInteger, AtomicBoolean, AtomicReference上. 这些变量都是可以常常用作判断线程进行状态的flag. 传统的关键字volatile只保证了变量的visibility, 却缺乏了accessibility. 而使用Java自带的原子变量, 可以更有效的, 快速的解决并发的实际问题. 一个CAS的赋值操作, 由一个pair组成: (expectedCurrentValue, newValue). 当赋值实现了CAS的变量一个新值的时候, 先验当前值是否等于expectedCurrentValue, 如果等于, 则赋newValue, 否则返回CAS变量的值, 这样, 通过比较返回的值, 就可以知道是否赋值成功. 通过以上的CAS, 延伸出了ConcurrentStack (Treiber, 1986), Non-blocking Queue (Michael and Scoot, 1996) 等non-blocking的数据结构. 这些数据结构因为更贴近硬件操作并且是线程安全的, 所以在新的JVM中, 很多Concurrent的数据结构都使用了这种CAS的思想. 但是设计一个CAS的数据结构, 需要充分理解数据结构在并发下的state机制, […]

安装CHelper插件在Intellij IDEA中.

不知道什么是Intellij IDEA的,用Eclipse的可以自行离去了. CHelper是一个能把Topcoder,Codeforces, Google Code Jam的题拿到本地做, 然后在本地提交的一个插件, 是Egor Kulikov(大牛)编写并维护(维护个毛线…)的. 以前需要去Google Code里下载, 然后调试, 非常繁复. 现在Egor把CHelper做进了一个插件, 使安装非常简单, 也不需要配置什么环境变量了.具体步骤如下: 在Intellij(我用的是商业版)的主页面(非Project页面)里, 选下面的Configure -> Plugins. 选Browse repositories.搜CHelper, 下载, 重启Idea. 在工具栏空白处点右键:, 选Customize Menus and Toolbars 双击Main Toolbar, 然后添加一个Separator: 点到新建的Separator, 然后选Add After,在Plug-ins中找到CHelper, 然后把下面几个都加进去. 点击Edit Project Setting (那个小齿轮), 然后如下设置: 这样对Local Tasks就可以了, 我的目录结构:  如果你玩Topcoder, 需要在Topcoder中的Options -> Editor Preferences中, 选CHelper做Default. 使用CHelper做题时: 如果用Topcoder, 点击, 然后选SRM的题就可以了, 不要忘记编译完后, 需要点击提交. […]

书脊

倾城与倾国, 佳人难再得