CAS

2020年工作感悟

扶醉桌前 提交于 2020-12-11 01:27:38
2020 年工作感悟 时光流逝,转眼已经来到了年末。回首过去,我于2020年5月份有幸加入了这个大家庭。我从未知到已知,和公司同事一道为了实现采购信息化的目标而努力奋斗着。转眼间2020年只剩最后一个月,回顾这一年。我们曾为梦想拼搏,也曾遭遇挫折,我们欢呼过,也痛哭过;如今你还有哪些目标没有完成?最后一个月,再拼一把! 2020 年是不平凡的一年,平凡的我们,也创造了不平凡。疫情期间,各级领导及同事们戴着口罩,坚守岗位,夜以继日的工作。在平凡的岗位上做着伟大的事业。 一年即将过去,回望过去,往事历历在目,首先对今年的工作总结如下: 权限系统开发、试运行和上线:一个系统,如果没有安全控制,是十分危险的,一般安全控制包括身份认证和权限管理。用户访问时,首先需要查看此用户是否是合法用户,然后检查此用户可以对那些资源进行何种操作,最终做到安全访问。身份认证的方式有很多种,最简单的就是直接用户名密码,还有业内比较通用的方式CAS方式登陆等;授权的框架也很多,比如OAuth2,Shiro等。权限系统集成的CAS,以及基于角色的权限管理模型(RBAC)的概念在业界接受度较高的权限模型是RBAC(Role-Based Access Control),基本的概念是将“角色”这个概念赋予用户,在系统中用户通过分配角色从而获得相应的权限,一个用户可以有多个角色,一个角色可以有多个权限

Java容器(List、Set、Map)知识点快速复习手册(中)

余生长醉 提交于 2020-12-09 10:35:04
前言 本文快速回顾了Java中容器的知识点,用作面试复习,事半功倍。 上篇:主要为容器概览,容器中用到的设计模式,List源码 中篇:Map源码 下篇:Set源码,容器总结 其它知识点复习手册 Java基础知识点面试手册(上) Java基础知识点面试手册(下) Java容器(List、Set、Map)知识点快速复习手册(上) HashMap http://wiki.jikexueyuan.com/project/java-collection/hashmap.html 源码分析: https://segmentfault.com/a/1190000014293372 关键词 初始容量16 扩容是2倍,加载因子0.75 头插法 0桶存放null 从 JDK 1.8 开始,一个桶存储的链表长度大于 8 时会将链表转换为红黑树(前提:键值对要超过64个) 自动地将传入的容量转换为2的幂次方 保证运算速度:确保用位运算代替模运算来计算桶下标。hash& (length-1)运算等价于对 length 取模。 hash均匀分布:数据在数组上分布就比较均匀,并且能够利用全部二进制位,也就是说碰撞的几率小, table数组+Entry []链表(散列表),红黑树 扩容操作需要把键值对重新插入新的 table 中,重新计算所有key有特殊机制(JDK1.8后) 存储结构

CAS集群解决方案

拟墨画扇 提交于 2020-12-09 03:06:53
1. 总体方案 本方案的目的是搭建一个高可用,高可伸缩的中心认证服务。环境是 CAS 服务器是可任意扩展的,任意一个 CAS 服务节点均是等效的, CAS 服务器的状态信息是集中存储的; CAS 服务的客户端应用也是集群的环境,客户端应用服务器也是可任意扩展的,客户端应用的 session 状态信息是集中存储的,任意两个应用服务节点都是等效的; CAS 服务器和客户端应用的状态信息集中存储在缓存服务器 Memcached 上。该方案具有以下特性。 l 只支持 Tomcat6.x 和 Tomcat7.x 。 l 无单点故障。 l 能够应对 Tomcat 故障转移。 l 能够应对 memcached 故障转移。 注意:上述方案中有一个问题是如果 cas 服务端应用程序或者客户端应用程序将某些状态数据直接存储在 jvm 本地对象中的时候,则节点会出现不等效的情况,甚至出现不稳定的故障。该问题的解决办法是: 1. 避免这样的情况。 2. 同步各 jvm 实例之间的所有对象。 1.1. 正常登录流程(未单点登录)讨论 讨论用户的浏览器里无 TGT cookie值,即未曾登录过 CAS 服务器。 1. 用户浏览器访问必联网受保护的资源,假设用户未登录必联网应用,由于必联网各节点的 session 状态集中存储,则任意一个节点都是等效的。 2. 用户浏览器被转发请求到 cas 服务器

Java基础整理(全是干货)

不问归期 提交于 2020-12-08 04:38:08
一.hashMap与hashTable与ConcurrentHashMap: 1.HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary类。不过它们都同时实现了map、Cloneable(可复制)、Serializable(可序列化)这三个接口。<Dictionary类是一个已经被废弃的类> 2.Hashtable既不支持Null key也不支持Null value。HashMap中,null可以作为键,这样的键只有一个,可以有一个或多个键所对应的值为null。 3.Hashtable是线程安全的,它的每个方法中都加入了Synchronize方法。在多线程并发的环境下,可以直接使用Hashtable,不需要自己为它的方法实现 同步,HashMap不是线程安全的,在多线程并发的环境下,可能会产生死锁等问题。如果想要线程安全的 HashMap,可以通过Collections类的静态方法synchronize dMap获得线程安全的HashMap。 <Map map = Collections.synchronizedMap(new HashMap())>; 4.hashMap的数据结构:HashMap的底层主要是基于数组和链表来实现的,它之所以有相当快的查询速度主要是因为它是通过计算散列码来决定存储的位置。 5

多线程容易产生的40个问题汇总

半城伤御伤魂 提交于 2020-12-07 05:46:29
这些多线程的问题,有些来源于各大网站、有些来源于自己的思考。可能有些问题网上有、可能有些问题对应的答案也有、也可能有些各位网友也都看过,但是本文写作的重心就是 所有的问题都会按照自己的理解回答一遍,不会去看网上的答案 ,因此可能有些问题讲的不对,能指正的希望大家不吝指教。 40个问题汇总 1、多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡。所谓”知其然知其所以然”,”会用”只是”知其然”,”为什么用”才是”知其所以然”,只有达到”知其然知其所以然”的程度才可以说是把一个知识点运用自如。OK,下面说说我对这个问题的看法: (1)发挥多核CPU的优势 随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的,4核、8核甚至16核的也都不少见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。 单核CPU上所谓的”多线程”那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看着像多个线程”同时”运行罢了 。多核CPU上的多线程才是真正的多线程,它能让你的多段逻辑同时工作,多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的。 (2)防止阻塞 从程序运行效率的角度来看,单核CPU不但不会发挥出多线程的优势

JAVA面试--史上最全 Java 多线程面试题及答案

烂漫一生 提交于 2020-12-06 23:32:19
史上最全 Java 多线程面试题及答案 这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题。 这些多线程的问题,有些来源于各大网站、有些来源于自己的思考。可能有些问题网上有、可能有些问题对应的答案也有、也可能有些各位网友也都看过,但是本文写作的重心就是所有的问题都会按照自己的理解回答一遍,不会去看网上的答案,因此可能有些问题讲的不对,能指正的希望大家不吝指教。 1、多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡。所谓"知其然知其所以然","会用"只是"知其然","为什么用"才是"知其所以然",只有达到"知其然知其所以然"的程度才可以说是把一个知识点运用自如。OK,下面说说我对这个问题的看法: 1)发挥多核CPU的优势 随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的,4核、8核甚至16核的也都不少见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。 单核CPU上所谓的"多线程"那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看着像多个线程"同时"运行罢了 。多核CPU上的多线程才是真正的多线程,它能让你的多段逻辑同时工作,多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的。 2)防止阻塞

拼多多、饿了么、蚂蚁金服Java面试题大集合

你。 提交于 2020-12-05 20:49:59
自己当初找工作时参加过众多一线互联网公司的Java研发面试,这段时间处于寒冬,然而前几天跳槽找工作,两天面了3家,已经拿了两个offer,觉得可以和大家分享下: 下面为拼多多、饿了么、蚂蚁金服、哈啰出行等公司给我留下较深印象的一些java面试题 private修饰的方法可以通过反射访问,那么private的意义是什么 Java类初始化顺序 对方法区和永久区的理解以及它们之间的关系 一个java文件有3个类,编译后有几个class文件 局部变量使用前需要显式地赋值,否则编译通过不了,为什么这么设计 ReadWriteLock读写之间互斥吗 Semaphore拿到执行权的线程之间是否互斥 写一个你认为最好的单例模式 B树和B+树是解决什么样的问题的,怎样演化过来,之间区别 写一个生产者消费者模式 写一个死锁 cpu 100%怎样定位 String a = "ab"; String b = "a" + "b"; a == b 是否相等,为什么 int a = 1; 是原子性操作吗 可以用for循环直接删除ArrayList的特定元素吗?可能会出现什么问题?怎样解决 新的任务提交到线程池,线程池是怎样处理 AQS和CAS原理 synchronized底层实现原理 volatile作用,指令重排相关 AOP和IOC原理 Spring怎样解决循环依赖的问题

自旋锁、偏向锁、轻量级锁与重量级锁

假装没事ソ 提交于 2020-12-05 19:22:17
java 中synchronized 锁的优化都是依赖对象头实现的,网上有关于对象头的资料大致概况如下图: 对象头 信息是实现synchronized 优化 的基础; 主要思想就是通过代码层面的判断,来减少真正锁的获取与释放时,CPU 用户态/内核态的切换带来的高成本(根本原因是java中的每个线程都映射到内核中一个线程,阻塞与唤醒都需要工作空间的切换);   自旋锁与偏向锁 都适用于实际应用中,可能只有 单个线程 在使用锁的情况;   轻量级锁适用于 同步块占用时间很短 的多线程竞争场景;   自旋锁、偏向锁、轻量级锁都是通过 自旋 的方式来获取锁; 自旋锁:   获取锁时,增加获取次数的设置;   自适应的自旋锁(1.6)会根据之前自旋的情况来判断下次自旋的次数;如果之前自旋成功概率较高,那么就增加下一次的自旋次数,否则减少自旋次数; 偏向锁:   大概意思就是如果某个线程获取锁成功,下次就更偏向于该线程获得锁;   条件:     锁对象的对象头-锁标志位为01   线程A在获取锁时,     1、查看锁对象的对象头线程ID是否为当前线程A,如果是,则获取锁成功;     2、否则CAS自旋替换线程ID,如果替换成功则获取成功;     3、更新失败则升级锁类型为轻量级锁; 轻量级锁:   在线程栈帧中创建一个Lock record,用于保存锁对象的对象头信息

偏向锁、轻量级锁、自旋锁、重量级锁

北城余情 提交于 2020-12-05 19:21:59
基础知识之一:锁的类型 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。 java中的乐观锁基本都是通过CAS操作实现的,CAS是一种更新的原子操作,比较当前值跟传入值是否一样,一样则更新,否则失败。 悲观锁 悲观锁是就是悲观思想,即认为写多,遇到并发写的可能性高,每次去拿数据的时候都认为别人会修改,所以每次在读写数据的时候都会上锁,这样别人想读写这个数据就会block直到拿到锁。java中的悲观锁就是Synchronized, AQS 框架下的锁则是先尝试cas乐观锁去获取锁,获取不到,才会转换为悲观锁,如RetreenLock。 基础知识之二:java线程阻塞的代价 java的线程是映射到操作系统原生线程之上的,如果要阻塞或唤醒一个线程就需要操作系统介入,需要在户态与核心态之间切换,这种切换会消耗大量的系统资源,因为用户态与内核态都有各自专用的内存空间,专用的寄存器等,用户态切换至内核态需要传递给许多变量、参数给内核,内核也需要保护好用户态在切换时的一些寄存器值、变量等,以便内核态调用结束后切换回用户态继续工作。