CAS

AQS底层原理分析

廉价感情. 提交于 2020-10-03 05:15:38
juc 1)synchronized实践中的问题: 锁的获得、锁的释放,不够灵活--》Lock的出现 2)Lock是一个接口: 意味着这是一个标准,有很多种实现。 重入锁,读写锁。 3)ReentrantLock: 重入的含义:获得锁时,再次去获得锁,只用记录次数就行,而不会阻塞。 synchronized 和 ReentrantLock 重入是为了解决死锁问题的。 4) AQS Sync 公平锁 非公平锁 5)ReentrantLock重入互斥锁 6)ReentrantReadWriteLock: 只是读的话,是不需要加锁的。 读多写少时可以提升性能。 只有读的时候,不会阻塞。 而A线程在写,B线程想去读取的时候,就会阻塞。 原因是: 必须保证B获取到的值是A写入的值。 写写、读写 就会互斥。 而 读读是不会互斥的。 7)ReentrantLock的实现: 当一个线程竞争锁的时候,其它线程怎么办? 按照我们之前的理解,必然是阻塞。那么如何实现的? 同步队列。 8)AQS有2种功能: 独占: 独占是互斥。 共享: 共享就是读写锁。 9)AQS的基本实现: 维护了一个双向链表。线程竞争失败时,被封装为Node(pre、next)节点加入,Node就是抢占锁失败的线程。 10)锁的基本要素: jvm层面的CAS,调用unsafe层面的东西 11)非公平锁: 允许插队 公平锁:

超值干货 | 值得收藏:精选BATJ面试突击500题详解:JVM篇!

笑着哭i 提交于 2020-10-02 15:24:30
JVM Java内存区域 说一下 JVM 的主要组成部分及其作用? 说一下 JVM 运行时数据区 深拷贝和浅拷贝 说一下堆栈的区别? 队列和栈是什么?有什么区别? HotSpot虚拟机对象探秘 对象的创建 为对象分配内存 处理并发安全问题 对象的访问定位 句柄访问 直接指针 内存溢出异常 Java会存在内存泄漏吗?请简单描述 垃圾收集器 简述Java垃圾回收机制 GC是什么?为什么要GC 垃圾回收的优点和原理。并考虑2种回收机制 垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收? Java 中都有哪些引用类型? 怎么判断对象是否可以被回收? 在Java中,对象什么时候可以被垃圾回收 JVM中的永久代中会发生垃圾回收吗 说一下 JVM 有哪些垃圾回收算法? 标记-清除算法 复制算法 标记-整理算法 分代收集算法 说一下 JVM 有哪些垃圾回收器? 详细介绍一下 CMS 垃圾回收器? 新生代垃圾回收器和老年代垃圾回收器都有哪些?有什么区别? 简述分代垃圾回收器是怎么工作的? 内存分配策略 简述java内存分配与回收策率以及Minor GC和Major GC 对象优先在 Eden 区分配 大对象直接进入老年代 长期存活对象将进入老年代 虚拟机类加载机制 简述java类加载机制? 描述一下JVM加载Class文件的原理机制 什么是类加载器

超罕见!Alibaba内部流行的“Java突击宝典”,金九银十程序员升职加薪必备!

折月煮酒 提交于 2020-10-02 11:17:21
前言 Alibaba作为一线互联网公司的代表,是大部分程序员梦寐以求的工作场所,确实大厂出来的程序员,其背景也更值钱,含金量也会更高。实际上,Alibaba程序员早已成为行业内学习的榜样和标杆,但实际上光鲜的背后付出的血汗是我们没看到的。那么阿里程序员平常都是怎么学习的呢? 今天就讲讲让我们一众菜鸡惊艳到的“Java突击宝典”,这份宝典在Alibaba内部流行已久,适合各个年限的程序员来学习,它主要将需要学习的技术栈分为了三个阶段: 0-1年开发经验(夯实基础):Java基础+并发编程+JVM基础+设计模式+SQL基础与优化+HTTP/TCP协议+算法与数据结构+学习能力+ 源码+Redis+了解一个消息产品 1-3年开发经验(合格的程序员):JVM基础调优+常见框架源码+MySQL优化+缓存+熟悉消息中间件(至少一个)+熟悉微服务(至少一个)+互联网项目经验+ Netty+分布式技术 4-5年开发经验(提升技术广度与深度):性能调优+分布式技术+微服务+技术选型+分布式场景问题+互联网项目经验+ 项目管理+团队管理 这三个阶段具体的内容如何?见下文揭晓吧。当然,文章有限,不能全部描述出来,有完整的pdf版可免费分享,添加下方小助手VX即可获取 0-1年:夯实基础 1.Java基础(Java异常分类及处理+Java反射+Java注解+Java内部类+Java泛型+Java序列化

面试网易严选Java开发工程师,太真实了,直接凉凉(凉经)

拈花ヽ惹草 提交于 2020-10-02 08:35:03
点关注,不迷路;持续更新Java相关技术及资讯!!! 内容源于群友投稿!记录一次面试网易失败的经验,分享给大家,感谢支持! 前言 金九银十,金九都只剩下最后一天了,面试的有成功有凉凉的,今天分享一次面试失败的经历,希望能帮助到大家避开这些坑。 网易严选一面凉 花三分钟进行自我介绍 介绍一个你比较擅长的数据结构?(我说链表) 写LRU 讲一下链表?你在那用到链表了?(我说在HashMap里面) HashMap为什么是线程不安全的? 为什么要用锁? 乐观锁和悲观锁? CAS介绍一下? i是AtomicInteger,i++1000次并发比较高,CAS存在什么问题? 知道说说CMS的垃圾收集过程?CMS存在Stop-The-World么?在哪一个阶段会存在呢那些垃圾回收算法?讲一下 有听过CMS和G1垃圾收集器么?谈谈这两个垃圾收集器 说说G1的垃圾收集过程? CMS和G1的区别是什么,什么时候用CMS,什么时候用G1呢 框架学习的怎么样?框架的源码有没有看过?为什么使用框架?Spring框架里面都有那些的设计模式? FileSystemResource和ClassPathResource之间的区别吗? 给定一个N,找到距离它最近的斐波那契数 平时有看过哪些书籍呢?你对哪本书总结的比较深入? 平时怎么学习的?平时遇见问题怎么解决? 总结 面试难免让人焦虑不安。经历过的人都懂的

集合面试题

爷,独闯天下 提交于 2020-10-02 08:00:55
集合 java的集合框架有哪几种: 两种:collection和map,其中collection分为set和List。 List你使用过哪些 ArrayList和linkedList使用的最多,也最具代表性。 你知道vector和ArrayList和linkedList的区别嘛 ArrayList实现是一个数组,可变数组,默认初始化长度为10,也可以我们设置容量,但是没有设置的时候是默认的空数组,只有在第一步add的时候会进行扩容至10(重新创建了数组),后续扩容按照3/2的大小进行扩容,是线程不安全的,适用多读取,少插入的情况 linkedList是基于双向链表的实现,使用了尾插法的方式,内部维护了链表的长度,以及头节点和尾节点,所以获取长度不需要遍历。适合一些插入/删除频繁的情况。 Vector是线程安全的,实现方式和ArrayList相似,也是基于数组,但是方法上面都有synchronized关键词修饰。其扩容方式是原来的两倍。 hashMap和hashTable和ConcurrentHashMap的区别 hashMap是map类型的一种最常用的数据结构,其底部实现是数组+链表(在1.8版本后变为了数组+链表/红黑树的方式),其key是可以为null的,默认hash值为0。扩容以2的幂等次(为什么。。。因为只有是2的幂等次的时候(n-1)&x==x%n,当然不一定只有一个原因

写了3年Java,竟然连ForkJoin框架都没用过

好久不见. 提交于 2020-10-02 07:35:14
在了解Fork-Join之前,我们得先了解什么是并行计算。 并行计算 相对于串行计算,并行计算可以划分成时间并行和空间并行。时间并行即指令流水化,也就是流水线技术。比如说生产一辆小汽车,有特定的轮子车间/发动机车间,同时进行各自的生产。空间并行是指使用多个处理器执行并发计算。 以程序和算法设计人员的角度看,并行计算又可分为数据并行和任务并行。数据并行把大的任务化解成若干个相同的子任务,任务并行是指每一个线程执行一个分配到的任务,而这些线程则被分配(通常是操作系统内核)到该并行计算体系的各个计算节点中去。 简单来说,并行计算是通过把大问题划分为小问题,运用计算机资源并行的处理子问题,当需要得到大问题的结果时,将小问题的结果按顺序合并起来得到最终结果。这种思想就是分治思想,小到归并排序,大到大数据计算... Fork-Join Fork-Join框架是Doug Lea 大神在JDK7引入的。Fork就是把大问题拆分成小问题,也就是大任务拆成多个子任务,并行执行子任务。Join就是把任务的结果按顺序合并起来。 假设我们需要求从 1-1亿之间的数字和,按照Fork-Join的思想,可分为以下三步: Step1.定义拆分子任务和合并子任务的规则 划分子任务的规则 首先将任务拆为 1-5千万 和 5千万01 - 1亿两个子任务,直到每个子任务计算的数字范围在1万以内的时候

Java线程安全解决方案(synchronized,ReentrantLock,Atomic使用场景描述)

六眼飞鱼酱① 提交于 2020-10-02 06:20:49
线程安全解决方案 synchronized,ReentrantLock,Atomic 使用场景描述 在实际开发过程中如果服务量,请求频繁,就会经常碰见并发,这时候不做处理就会出现很多非法数据。这时候就需要解决线程安全的问题,这时候就可以使用java当中的锁机制。常用有java关键 synchronized 、可重入锁 ReentrantLock ,还有并发包下的 Atomic 或者 Concurrent 的安全类型。 synchronized使用场景: 在资源竞争不是很激烈的情况下,偶尔出现并发,需要同步的情形下,synchronized是很合适的。原因在于,编译程序通常会尽可能的进行优化synchronized,另外可读性非常好,不管用没用过5.0多线程包的程序员都能理解。可以多对方法进行加锁(同步方法),也可以对对象进行加锁(同步代码快)。 /** * synchronized用id */ private static volatile Long syncId = 0 L ; /** * synchronized方式获取id 同步方法 * @return */ public static synchronized Long getSyncId1 ( ) { syncId ++ ; return syncId ; } /** * synchronized方式获取id 同步代码块

记一次订单号重复的事故,快看看你的 uuid 在并发下还正确吗?

时光总嘲笑我的痴心妄想 提交于 2020-10-02 04:03:46
     作者:funnyZpC   cnblogs.com/funnyzpc/p/13541713.html   去年年底的时候,我们线上出了一次事故,这个事故的表象是这样的:    系统出现了两个一模一样的订单号,订单的内容却不是不一样的,而且系统在按照 订单号查询的时候一直抛错,也没法正常回调,而且事情发生的不止一次,所以 这次系统升级一定要解决掉。   经手的同事之前也改过几次,不过效果始终不好:总会出现订单号重复的问题, 所以趁着这次问题我好好的理了一下我同事写的代码。   这里简要展示下当时的代码:    /** * OD单号生成 * 订单号生成规则:OD + yyMMddHHmmssSSS + 5位数(商户ID3位+随机数2位) 22位 */ public static String getYYMMDDHHNumber(String merchId){ StringBuffer orderNo = new StringBuffer(new SimpleDateFormat("yyMMddHHmmssSSS").format(new Date())); if(StringUtils.isNotBlank(merchId)){ if(merchId.length()>3){ orderNo.append(merchId.substring(0,3)); }else {

CAS5.2.3 Server端开启restful验证

痞子三分冷 提交于 2020-10-01 18:42:56
转载至: https://blog.csdn.net/u010588262/article/details/79818494 2020博客地址汇总 2019年博客汇总 CAS版本是5.2.3,开启restful肥肠简单,网上很多资料都是老版本的,大家伙不要看他们的看我的就行了哈哈哈哈哈哈哈哈哈哈 引入依赖 <!-- restful --> <dependency> <groupId>org.apereo.cas</groupId> <artifactId>cas-server-support-rest</artifactId> <version>${cas.version}</version> </dependency> application.properties # 开启rest验证并配置url cas.authn.rest.uri=https://www.hugeo.com:9898/cas/v1 好了,启动服务吧 我是用postman测试的,因为是本地的https请求,所以配置一下,不然会报错: 申请TGT https://www.hugeo.com:9898/cas/v1/tickets 用TGT申请ST https://www.hugeo.com:9898/cas/v1/tickets/TGT-XXXXXXXXXX 这里还有个需要注意的地方

cas5.x实现将ticket维护到redis集群(不使用官方提供的哨兵模式)

北城以北 提交于 2020-10-01 16:47:48
转载至: http://zhfeat.cc/article/45 2020博客地址汇总 2019年博客汇总 前段时间基于CAS 5.2.6为公司二次开发了一套SSO单点登陆系统,整体来说比较顺利,不过最后卡在了将CAS服务端登陆所产生的ticket放到redis集群中这一环节。现在网上相关资料最多的是基于CAS 4.x版本的文章,对于CAS 5.x版本相关的资料还是比较少的,因此没有找到具体的解决同学,纠结了许久最后通过覆盖官方提供的jar包中的类解决了这个问题,希望能帮助到同样遇到这个问题的童鞋。该问题可能会有更优雅的解决方式,如果大家有更好的解决思路希望能分享给我,大家一同进步。 什么是CAS 这段是对CAS原理的一个剖析和总结,已经很清楚的同学可以略过。 SSO单点登录访问流程主要有以下步骤 访问服务:SSO客户端发送请求访问应用系统提供的服务资源。 定向认证:SSO客户端会重定向用户请求到SSO服务器。 用户认证:用户身份认证。 发放票据:SSO服务器会产生一个随机的Service Ticket。 验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。 传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。 CAS 原理和协议 从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client