CAS

我说我懂多线程,面试官立马给我发了offer

烈酒焚心 提交于 2020-04-07 13:46:40
前言 只有光头才能变强。 文本已收录至我的GitHub精选文章,欢迎Star : https://github.com/ZhongFuCheng3y/3y 在上周总结了一篇「工作中常用到的Java集合类」,反响还不错。这周来写写Java另一个重要的知识点:「 多线程 」 多线程大家在初学的时候,对这个知识点应该有不少的疑惑的。我认为主要原因有两个: 多线程在初学的时候不太好学,并且一般写项目的时候也很少用得上(至少在初学阶段时写的项目基本不需要自己创建线程)。 多线程的知识点在面试经常考,多线程所涉及的知识点非常多,难度也不低。 这就会给人带来一种感觉「 这破玩意涉及的东西是真的广,平时也不怎么用,怎么面试就偏偏爱问这个鬼东西 」 不多BB,我要开始了。 为什么使用多线程? 首先,我们要明确的是「为什么要使用多线程」,可能有人会认为「 使用多线程就是为了加快程序运行的速度啊 」。如果你是这样回答了,那面试官可能会问你「那多线程是怎么加快程序运行速度的?」 于我的理解:使用多线程最主要的原因是 提高系统的资源利用率 。 现在CPU基本都是多核的,如果你只用单线程,那就是只用到了一个核心,其他的核心就相当于空闲在那里了。 厕所的坑位有5个,如果只用一个坑位,那不是很亏?比如现在我有5个人要上厕所。 在单线程的时候:进去一个人解决要10分钟,然后后面的人都得等一个坑位

shimingxy/MaxKey

社会主义新天地 提交于 2020-04-07 13:26:16
MaxKey MaxKey(马克思的钥匙) ,寓意是最大钥匙, 是用户单点登录认证系统(Sigle Sign On System),支持OAuth 2.0/OpenID Connect、SAML 2.0、JWT、CAS等标准化的开放协议,基于开放用户安全身份认证系统(User Security Access System),提供简单、可靠和安全的用户认证和单点登录,包含用户认证、单点登录、资源管理、权限管理等。 什么是 单点登录(Single Sign On) ,简称为 SSO ? 用户只需要登录认证中心一次就可以访问所有相互信任的应用系统,无需再次登录。 MaxKey on GitHub MaxKey on 码云(Gitee) 官方文档 QQ交流群: 434469201 点击链接加入群聊 邮箱EMAIL: shimingxy@163.com 标准化认证协议: 序号 协议 支持 1 OAuth 2.0/OpenID Connect 高 2 SAML 2.0 高 3 JWT 高 4 CAS 高 5 FormBased 中 6 TokenBased(Post/Cookie) 中 7 ExtendApi 低 8 EXT 低 登录支持 序号 登录方式 1 动态验证码 2 双因素认证 3 Google Authenticator 4 Kerberos/Spengo/AD域 5 社交账号 微信

cas+openldap实现单点登录认证一

孤街浪徒 提交于 2020-04-07 10:26:31
1、下载cas server:http://www.jasig.org/cas/download(本例使用的版本为:cas-server-3.5.2-release.zip) 2、下载spring ldap包(本例使用版本为:spring-ldap-1.3.1.RELEASE-all.jar) 3、部署cas server 修改配置文件:F:\sso\tomcat-cas\webapps\cas\WEB-INF\deployerConfigContext.xml 4、定义openldap认证地址:<beans>跟节点下增加bean:ContextSource 的配置 <bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource"> <property name="pooled" value="false"/> <property name="url" value="ldap://192.168.10.237:389" /> <property name="userDn" value="cn=Manager"/> <property name="password" value="secret"/><!-- 自己openldap的密码 --> <property name=

shimingxy/MaxKey

|▌冷眼眸甩不掉的悲伤 提交于 2020-04-07 10:24:04
MaxKey MaxKey(马克思的钥匙) ,寓意是最大钥匙, 是用户单点登录认证系统(Sigle Sign On System),支持OAuth 2.0/OpenID Connect、SAML 2.0、JWT、CAS等标准化的开放协议,基于开放用户安全身份认证系统(User Security Access System),提供简单、可靠和安全的用户认证和单点登录,包含用户认证、单点登录、资源管理、权限管理等。 什么是 单点登录(Single Sign On) ,简称为 SSO ? 用户只需要登录认证中心一次就可以访问所有相互信任的应用系统,无需再次登录。 MaxKey on GitHub MaxKey on 码云(Gitee) 官方文档 QQ交流群: 434469201 点击链接加入群聊 邮箱EMAIL: shimingxy@163.com 标准化认证协议: 序号 协议 支持 1 OAuth 2.0/OpenID Connect 高 2 SAML 2.0 高 3 JWT 高 4 CAS 高 5 FormBased 中 6 TokenBased(Post/Cookie) 中 7 ExtendApi 低 8 EXT 低 登录支持 序号 登录方式 1 动态验证码 2 双因素认证 3 Google Authenticator 4 Kerberos/Spengo/AD域 5 社交账号 微信

SSO之CAS单点登录详细搭建

为君一笑 提交于 2020-04-07 08:54:11
SSO之CAS单点登录详细搭建 : 环境说明: 同一个机器上环境如下: 操作系统:windows7 64位 JDK版本:1.7.0_80 web容器版本:apache-tomcat-7.0.70 64位 服务端:cas-3.5.2.1.zip 服务端现在地址:https://github.com/apereo/cas/archive/v4.2.3.zip 客户端:cas-client-3.3.3-release.zip 客户端下载地址:http://developer.jasig.org/cas-clients/ eclipse版本:eclipse-jee-luna-SR2-win32-x86_64.zip 1、将cas-3.5.2.1 cas-client-3.3.3 标准maven工程导入eclipse 打包编译; 2、修改本机 C:\Windows\System32\drivers\etc\hosts (CAS单点登录系统是基于JAVA安全证书的 https 访问,要使用CAS单点登录必须要配置域名, cas是不能通过ip访问的.) 附件-->记事本管理员权限编辑hosts文件,加入如下三行代码后保存。 127.0.0.1 server.flyer.com 127.0.0.1 client1.flyer.com 127.0.0.1 client2.flyer.com 解释:

并发容器学习—ConcurrentLinkedQueue和ConcurrentLinkedDuque

感情迁移 提交于 2020-04-07 04:31:18
一、ConcurrentLinkedQueue并发容器 1. ConcurrentLinkedQueue 的底层数据结构 ConcurrentLinkedQueue是一个底层基于链表实现的无界且线程安全的队列。遵循先进先出(FIFO)的原则 。 队列的头部是队列中时间最长的元素。队列的尾部是队列中时间最短的元素。它采用CAS算法来实现同步,是个非阻塞的队列。 底层链表由一个个Node结点组成,Node的定义如下: private static class Node<E> { volatile E item; //存放数据 volatile Node<E> next; //指向下个结点 //构造方法 Node(E item) { UNSAFE.putObject(this, itemOffset, item); //unsafe操作赋值 } //CAS方式尝试更新数据 boolean casItem(E cmp, E val) { return UNSAFE.compareAndSwapObject(this, itemOffset, cmp, val); } void lazySetNext(Node<E> val) { UNSAFE.putOrderedObject(this, nextOffset, val); } //CAS方式更新下个结点地址 boolean casNext

CAS Server Client 配置

假装没事ソ 提交于 2020-04-06 16:56:04
CAS服务端运行环境: CAS 版本: 5.3.14 Spring Boot 版本: 1.5.18.RELEASE Spring 版本: 4.3.25.RELEASE Java 版本: 1.8.0_162 操作系统: Windows 10 64位 Apache Tomcat 版本: Apache Tomcat/8.5.53 CAS Server 安装与依赖 GutHub地址: https://github.com/apereo/cas-overlay-template/tree/5.3 执行准备命令: build.cmd copy,build.gencert 打包命令:build.cmd package Tomcat 运行 cas.war pom.xml完整配置 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd "> <modelVersion>4.0.0

面试刷题22:CAS和AQS是什么?

只谈情不闲聊 提交于 2020-04-06 13:44:49
<br /> <br /> <br />java并发包提供的同步工具和线程池,底层是基于什么原理来设计和实现的呢?这个非常重要。<br /> <br /> <br />我是李福春,我在准备面试,今天的题目是:<br /> <br />CAS和AQS是什么?<br /> <br />答:CAS是一系列的操作集合,获取当前值进行计算,如果当前值没有改变,表示线程没有被占用,直接更新成功,否则,进行重试或者返回成功或者失败。 他是java并发工具包中lock-free的基础吗,依赖底层的cpu提供的特定指令实现。底层依赖于Unsafe的本地对象来实现。<br /> AQS: 全称是AbstractQueuedSynchronizier,抽象队列同步器;他是各种同步工具锁的基础,比如ReentrantLock, CyclicBairier都是基于AQS来实现的。 CAS <br />以AtomicInteger为例子来分析一下CAS的应用。<br /> <br />首先看内部结构:<br /> <br /> <br />然后分析一下他的一个利用CAS实现的原子操作。 ```java public final int getAndAddInt(Object o, long offset, int delta) { int v; do { v = getIntVolatile(o,

java并发安全

老子叫甜甜 提交于 2020-04-06 09:33:06
java并发安全 本次内容主要线程的安全性、死锁相关知识点。 1、什么是线程安全性 1.1 线程安全定义 前面使用8个篇幅讲到了Java并发编程的知识,那么我们有没有想过什么是线程的安全性?在《Java并发编程实战》中定义如下:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在调用代码中不需要任何额外的同步或者协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。 1.2 无状态类 没有任何成员变量的类,就叫无状态类,这种类一定是线程安全的。但是有一种情况是,这个类方法的参数中用到了对象,看下面的代码: public class StatelessClass { public void test(User user) { //do business } } 此时这个类还是线程安全的吗?那肯定也是,为什么呢?因为多线程下的使用,固然user这个对象的实例会不正常,但是对于StatelessClass这个类的对象实例来说,它并不持有User的对象实例,它自己并不会有问题,有问题的是User这个类,而非StatelessClass本身。 1.2 volatile 并不能保证类的线程安全性,只能保证类的可见性,最适合一个线程写,多个线程读的情景。 1.3 锁和CAS 我们最常使用的保证线程安全的手段,使用synchronized关键字

005. 线程安全之原子操作

核能气质少年 提交于 2020-04-06 09:25:58
1. 理解原子操作 1. 实现一个简单的测试用例 public class Counter { volatile int i = 0; public void add() { i++; } } public class Demo1_CounterTest { public static void main(String[] args) throws InterruptedException { final Counter ct = new Counter(); for (int i = 0; i < 6; i++) { new Thread(() -> { for (int j = 0; j < 10000; j++) { ct.add(); } System.out.println("done..."); }).start(); } Thread.sleep(6000L); System.out.println(ct.i); } } 2. 结果分析 最终的结果是小于等于60000。 原因: i++ 并不是一个原子操作。 反编译 Counter 类,部分结果如下: 针对操作进行了切分: 3. 原子操作描述 原子操作可以是一个步骤,也可以是多个步骤,但是其顺序不可以被打乱,也不可以被切割而只执行其中的一部分(不可中断性)。 将整个操作是做一个整体,资源在该次操作中保持一致