CAS

Java多线程常见问题

自闭症网瘾萝莉.ら 提交于 2021-02-04 04:22:50
记录Java多线程的常见概念和原理 参考: https://blog.csdn.net/justloveyou_/article/details/78313167 如何停止一个线程 使用volatile变量终止正常运行的线程 + 抛异常法/Return法 组合使用interrupt方法与interruptted/isinterrupted方法终止正在运行的线程 + 抛异常法/Return法 使用interrupt方法终止 正在阻塞中的 线程 线程安全 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么这个类就是线程安全的。 为什么wait(), notify()和notifyAll()被定义在Object类里 Wait-notify机制是在获取对象锁的前提下不同线程间的通信机制。在Java中,任意对象都可以当作锁来使用,由于锁对象的任意性,所以这些通信方法需要被定义在Object类里。 为什么wait(), notify()和notifyAll()必须在同步方法或者同步块中被调用 wait/notify机制是依赖于Java中Synchronized同步机制的,其目的在于确保等待线程从Wait()返回时能够感知通知线程对共享变量所作出的修改。如果不在同步范围内使用

单点登录的三种实现方式

五迷三道 提交于 2021-02-03 08:28:06
在 B/S 系统中,登录功能通常都是基于 Cookie 来实现的。当用户登录成功后,一般会将登录状态记录到 Session 中,或者是给用户签发一个 Token,无论哪一种方式,都需要在客户端保存一些信息(Session ID 或 Token ),并要求客户端在之后的每次请求中携带它们。 在这样的场景下,使用 Cookie 无疑是最方便的,因此我们一般都会将 Session 的 ID 或 Token 保存到 Cookie 中,当服务端收到请求后,通过验证 Cookie 中的信息来判断用户是否登录 。 单点登录(Single Sign On, SSO)是指在同一帐号平台下的多个应用系统中,用户只需登录一次,即可访问所有相互信任的应用系统。 举例来说,百度贴吧和百度地图是百度公司旗下的两个不同的应用系统,如果用户在百度贴吧登录过之后,当他访问百度地图时无需再次登录,那么就说明百度贴吧和百度地图之间实现了单点登录。 单点登录的本质就是在多个应用系统中共享登录状态。如果用户的登录状态是记录在 Session 中的,要实现共享登录状态,就要先共享 Session,比如可以将 Session 序列化到 Redis 中,让多个应用系统共享同一个 Redis,直接读取 Redis 来获取 Session。 当然仅此是不够的,因为不同的应用系统有着不同的域名,尽管 Session 共享了,但是由于

volatile 和 内存屏障

£可爱£侵袭症+ 提交于 2021-02-03 02:02:13
接下来看看volatile是如何解决上面两个问题的: 被volatile修饰的变量在编译成字节码文件时会多个lock指令,该指令在执行过程中会生成相应的 内存屏障 ,以此来解决可见性跟重排序的问题。 内存屏障的作用: 1.在有内存屏障的地方, 会禁止指令重排序 ,即屏障下面的代码不能跟屏障上面的代码交换执行顺序。 2.在 有内存屏障的地方 ,线程修改完共享变量以后会 马上把该变量从本地内存写回到主内存 , 并且让其他线程本地内存中该 变量副本失效 (使用MESI协议) 作者:凌风郎少 链接:https://www.jianshu.com/p/0c3a349663db 来源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。 volatile 的实现原理 通过对 OpenJDK 中的 unsafe.cpp 源码的分析,会发现被 volatile 关键字修饰的变量会存在一个 “ lock: ”的前缀。 Lock 前缀, Lock 不是一种内存屏障 ,但是它能完成 类似内存屏障的功能 。 Lock 会对 CPU 总线和高速缓存加锁 ,可以理解为 CPU 指令级的一种锁。 类似于 Lock 指令。 在具体的执行上, 它先对总线和缓存加锁 ,然后 执行后面的指令 ,在 Lock锁住总线 的时候,其他CPU的读写请求都会 被阻塞 , 直到锁释放 。最后 释放锁后

Java并发编程之CAS

梦想与她 提交于 2021-02-02 14:55:43
CAS(Compare and swap)比较和替换是设计并发算法时用到的一种技术。简单来说,比较和替换是使用一个期望值和一个变量的当前值进行比较,如果当前变量的值与我们期望的值相等,就使用一个新值替换当前变量的值。这听起来可能有一点复杂但是实际上你理解之后发现很简单,接下来,让我们跟深入的了解一下这项技术。 CAS的使用场景 在程序和算法中一个经常出现的模式就是“check and act”模式。先检查后操作模式发生在代码中首先检查一个变量的值,然后再基于这个值做一些操作。下面是一个简单的示例: class MyLock { private boolean locked = false; public boolean lock() { if(!locked) { locked = true; return true; } return false; } } 上面这段代码,如果用在多线程的程序会出现很多错误,不过现在请忘掉它。 如你所见,lock()方法首先检查locked>成员变量是否等于false,如果等于,就将locked设为true。 如果同个线程访问同一个MyLock实例,上面的lock()将不能保证正常工作。如果一个线程检查locked的值,然后将其设置为false,与此同时,一个线程B也在检查locked的值,又或者,在线程A将locked的值设为false之前。因此

Java并发编程CAS

本小妞迷上赌 提交于 2021-02-02 04:53:51
CAS 是什么 CAS 的全称 Compare-And-Swap,它是一条 CPU 并发。 它的功能是判断内存某一个位置的值是否为预期,如果是则更改这个值,这个过程就是原子的。 CAS 并发原体现在 JAVA 语言中就是 sun.misc.Unsafe 类中的各个方法。调用 UnSafe 类中的 CAS 方法,JVM 会帮我们实现出 CAS 汇编指令。这是一种完全依赖硬件的功能,通过它实现了原子操作。由于 CAS 是一种系统源语,源语属于操作系统用语范畴,是由若干条指令组成,用于完成某一个功能的过程,并且原语的执行必须是连续的,在执行的过程中不允许被中断,也就是说 CAS 是一条原子指令,不会造成所谓的数据不一致的问题。 比较并交换 CAS的意思就是比较并交换。上面说到,这个比较过程是原子的。我们新建一个测试类。 public class CASDemo { public static void main(String[] args) { checkCAS(); } public static void checkCAS(){ AtomicInteger atomicInteger = new AtomicInteger( 5 ); System.out.println(atomicInteger.compareAndSet( 5 , 2019 ) + "\t current

ConcurrentHashMap(细节篇)

天涯浪子 提交于 2021-02-02 01:38:36
本篇文章接上篇文章,介绍一些ConcurrentHashMap的细节,虽然不是特别重要,但也是干货满满。 先列一个参数: //0:表示counterCells无人使用 //因为counterCells是一个数组,线程不安全的 //所以在操作counterCells之前,都要用CAS将cellsBusy改成1,表示有人在使用该数组 private transient volatile int cellsBusy ; 方法列表 spread(): addCount的第一部分: 判断是否有失败的风险 判断是否可以投机 fullAddCount(): counterCells != null,找到的下标 == n 找到的下标 != null counterCells == null ThreadLocalRandom.getProbe(): ThreadLocalRandom.localInit(): ThreadLocalRandom.advanceProbe(): 面试题:concurrentHashMap的key和value为啥不能为null spread(): spread(int h): //跟hashmap有点区别,不仅高16参与了计算,并且还再次 & 计算 return ( h ^ ( h >>> 16 ) ) & HASH_BITS ; 前面运算这里不解释

并发编程之Java锁

生来就可爱ヽ(ⅴ<●) 提交于 2021-02-01 09:33:24
一、重入锁 锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized(重量级) 和 ReentrantLock(轻量级)等等 ) 。这些已经写好提供的锁为我们开发提供了便利。 重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。 在JAVA环境下 ReentrantLock 和synchronized 都是 可重入锁 synchronized: public class Test implements Runnable { public synchronized void get() { System.out.println("name:" + Thread.currentThread().getName() + " get();"); } public synchronized void set() { System.out.println("name:" + Thread.currentThread().getName() + " set();"); get(); } @Override public void run() { set(); } public static void main(String[] args) { Test ss = new Test(); new Thread

ConcurrentHashMap详解

人走茶凉 提交于 2021-01-30 18:59:47
原文链接 http://zhhll.icu/2020/12/14/java%E5%9F%BA%E7%A1%80/%E9%9B%86%E5%90%88/ConcurrentHashMap%E8%AF%A6%E8%A7%A3/ ConcurrentHashMap详解 JDK7 Segment 在jdk8之前concurrentHashMap使用该对象进行分段加锁,降低了锁的粒度,使得并发效率提高,Segment本身也相当于一个HashMap,Segment包含一个HashEntry数组,数组中每个HashEntry既是一个键值对,又是一个链表的头结点 get方法 根据key做hash运算,得到hash值 通过hash值,定位到对应的segment对象 再次通过hash值,定位到segment当中数组的具体位置 put方法 根据key做hash运算,得到hash值 通过hash值,定位到对应的segment对象 获取可重入锁 再次通过hash值,定位到segment当中数组的具体位置 插入或覆盖hashEntry对象 释放锁 但是使用这种方式实现需要进行两次hash操作,第一次hash操作找到对应的segment,第二次hash操作定位到元素所在链表的头部 JDK8 在jdk8的时候参考了HashMap的设计,采用了数组+链表+红黑树的方式,内部大量采用CAS操作,舍弃了分段锁的思想

CAS implementation to Oracle APEX

五迷三道 提交于 2021-01-29 09:58:03
问题 I'm trying to implement CAS into APEX application. I have some instruction how to implement it into typical java webapp. I know what to add into the web.xml with all configuration, and this is the easy part. I need to add some dependecies to pom.xml. How i can find it and is this possible to add some dependencies to apex application? Apex 19.1 is running on tomcat 9 on linux server. 回答1: I need to add some dependecies to pom.xml. How i can find it and is this possible to add some dependencies

聊聊cortex的kv.Client

时光总嘲笑我的痴心妄想 提交于 2021-01-29 04:22:39
序 本文主要研究一下cortex的kv.Client kv.Client github.com/cortexproject/cortex/pkg/ring/kv/client.go // Client is a high-level client for key-value stores (such as Etcd and // Consul) that exposes operations such as CAS and Watch which take callbacks. // It also deals with serialisation by using a Codec and having a instance of // the the desired type passed in to methods ala json.Unmarshal. type Client interface { // List returns a list of keys under the given prefix. Returned keys will // include the prefix. List(ctx context.Context, prefix string) ([]string, error) // Get a specific key. Will use a