CAS

25张图带你深入了解AQS

有些话、适合烂在心里 提交于 2020-08-11 07:02:53
AQS实现原理 AQS中 维护了一个volatile int state(代表共享资源)和一个FIFO线程等待队列(多线程争用资源被阻塞时会进入此队列)。 这里volatile能够保证多线程下的可见性,当state=1则代表当前对象锁已经被占有,其他线程来加锁时则会失败,加锁失败的线程会被放入一个FIFO的等待队列中,比列会被UNSAFE.park()操作挂起,等待其他获取锁的线程释放锁才能够被唤醒。 另外state的操作都是通过CAS来保证其并发修改的安全性。 具体原理我们可以用一张图来简单概括: AQS 中提供了很多关于锁的实现方法, getState():获取锁的标志state值 setState():设置锁的标志state值 tryAcquire(int):独占方式获取锁。尝试获取资源,成功则返回true,失败则返回false。 tryRelease(int):独占方式释放锁。尝试释放资源,成功则返回true,失败则返回false。 这里还有一些方法并没有列出来,接下来我们以ReentrantLock作为突破点通过源码和画图的形式一步步了解AQS内部实现原理。 目录结构 文章准备模拟多线程竞争锁、释放锁的场景来进行分析AQS源码: 三个线程(线程一、线程二、线程三)同时来加锁/释放锁 目录如下: 线程一加锁成功时AQS内部实现 线程二/三加锁失败时AQS中等待队列的数据模型

精选BAT Java面试突击1000道面试题详解:JVM篇.建议收藏

前提是你 提交于 2020-08-11 04:52:07
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文件的原理机制 什么是类加载器

面试被问ReentrantLock的公平锁与非公平锁,区别以及实现

怎甘沉沦 提交于 2020-08-11 04:43:01
面试被问ReentrantLock的公平锁与非公平锁的区别以及实现。 案例 public class LockDemo { public static void main(String[] args) { Lock lock = new ReentrantLock(); try { lock.lock(); System.out.println("获得锁"); } finally { lock.unlock(); System.out.println("释放锁"); } } } 运行结果 先看ReentrantLock的构造方法源码: private final Sync sync; public ReentrantLock() { sync = new NonfairSync(); } 所以,记住默认是非公平锁,有在new 的时候参数为true的时候才变成了公平锁。 再看Sync是个什么东东 abstract static class Sync extends AbstractQueuedSynchronizer { } 可以看出这个是继承于AQS的一个静态抽象内部类。有两个子类 这两个类也就是我们所说的公平锁与非公平锁。 还可以通过手动设置公平锁与非公平锁 public ReentrantLock(boolean fair) { sync = fair ? new

干货 | 一个架构师谈什么是架构,以及怎么成为架构师

穿精又带淫゛_ 提交于 2020-08-11 04:03:02
   正文   来点轻松的话题。我们调剂一下后再继续讲CAS SSO单点登录吧因为后面的内容全部和代码有关,大家会觉得枯燥。所以今天我们先来点”番外篇“,讲讲什么是架构师,什么是架构这个永恒的话题吧。此篇源出自我在公司内部写的一个PPT,它是用于在公司内部向广大技术人员做普及用的一个资料,而CSDN这边的编辑不支持图文混排的效果,因此一些章节我就直接截取自我的PPT里的内容了,这样可能对大家在阅读上会显得更加生动和活泼一些吧。    架构的定义   先来看看软件架构的普遍定义吧。   一个程序和计算系统软件体系结构是指系统的一个或多个结构。结构中包括软件的构建,构建的外部可见属性以及它们之间的相互关系。   体系结构并非可运行软件。确切的说,它是一种表达,使软件工程师能够:   分析设计在满足规定需求方面的有效性。   在设计变更相对容易的阶段,考虑体系结构可能的选择方案。   降低与软件构造相关联的风险。    软件架构的生命周期   软件开发有其生命周期,它应该是:      而软件架构也有着其生命周期,它又是怎么样的呢?       软件架构的重要性   为什么说一个软件架构是很重要的呢?直接编程直接开发,多EASY?请看下面几点:   软件架构能够满足系统的品质   架构设计使受益人达成一致的目标   架构设计能够支持计划编制过程   架构设计对系统开发的指导性  

NoSQL之一:Memcached

会有一股神秘感。 提交于 2020-08-11 02:19:05
一、NoSQL简介 NoSQL并不是No SQL(不再需要SQL),而是指Not Only SQL(不仅仅只有SQL)。NoSQL并不是用来替代关系型数据库的,而是在某些使用关系型数据库不合适的场景中,可以使用NoSQL数据库进行优化,而在系统中主要的、常规的数据仍然使用关系型数据库。   常用的NoSQL数据库有Memcached、Redis、MongoDB等,其中前两者属于键值对数据库,后者属于文档数据库。它们都有各自的优缺点以及使用场景。 二、Memcached介绍与安装 Memcached是一个专门用来做缓存的数据库,缓存的数据都是在内存当中,当数据库重启之后,数据也就都丢失了。其相当于一个Dictionary键值对集合,根据Key值取Value值。   1、Memcached安装    从网上下载Memcached-win64-1.4.4-14.zip安装包。解压后,通过管理员权限执行如下命令,可将其安装成服务: G:\MemcachedAfterInstall>memcached.exe -d install   2、Memcached可视化工具     TreeNMS是一款Redis、Memcached可视化客户端工具,实现基于Web方式对Redis、Memcached数据库进行管理、维护。可通过如下链接 http://www.treesoft.cn/dms.html

JEESZ分布式框架--单点登录集成方案

老子叫甜甜 提交于 2020-08-10 23:51:57
一般注销是跳到原项目的登录页面,所以我们需要对CAS做如下配置: 1. 修改服务端cas-servlet.xml配置(apache-tomcat-7.0.40\cas\ROOT\WEB-INF),找到 <bean id="logoutController" class="org.jasig.cas.web.LogoutController" /> 增加属性 p:followServiceRedirects="true" 2.修改客户端,sso1,sso2 index.jsp文件将原来的单点登出的URL修改成: Sso1: http://jeesz.cn:8080/logout?service=http://www.sso1.com:8080 Sso2: http://jeesz.cn:8080/logout?service=http://www.sso2.com:8080 重启Tomcat,测试正常。 第六节:多项目集成单点登录配置 第一步:单点登录系统与其他项目集成 在WEB 项目中的WEB-INF目录下的web.xml文件,添加以下配置. <!--SSO客户端配置 用于单点退出,该过滤器用于实现单点登出功能,可选配置 --> <listener> <listener-class>org.jasig.cas.client.session

Java并发编程(05):悲观锁和乐观锁机制

雨燕双飞 提交于 2020-08-10 23:37:34
本文源码: GitHub·点这里 || GitEE·点这里 一、资源和加锁 1、场景描述 多线程并发访问同一个资源问题,假如线程A获取变量之后修改变量值,线程C在此时也获取变量值并且修改,两个线程同时并发处理一个变量,就会导致并发问题。 这种并行处理数据库的情况在实际的业务开发中很常见,两个线程先后修改数据库的值,导致数据有问题,该问题复现的概率不大,处理的时候需要对整个模块体系有概念,才能容易定位问题。 2、演示案例 public class LockThread01 { public static void main(String[] args) { CountAdd countAdd = new CountAdd() ; AddThread01 addThread01 = new AddThread01(countAdd) ; addThread01.start(); AddThread02 varThread02 = new AddThread02(countAdd) ; varThread02.start(); } } class AddThread01 extends Thread { private CountAdd countAdd ; public AddThread01 (CountAdd countAdd){ this.countAdd = countAdd

认证(Authentication)和授权(Authorization)总结

女生的网名这么多〃 提交于 2020-08-10 20:58:49
身份认证 是验证你的身份,一旦通过验证,即启用授权。你所拥有的身份可以进行哪些操作都是由 授权 规定。例如,任何银行客户都可以创建一个账户(如用户名),并使用该账户登录该银行的网上服务,但银行的授权政策必须确保只有你有权限访问自己的网上个人账户,当然前提是你得先通过身份认证。 简单来说就是: 认证回答「你是谁」的问题,授权规定「你能干什么」。 认证Authentication 认证意味着证实某个用户是他所声明的那个人。 Username and Password Credentials Multi-Factor Authentication Token Based Credentials a Better Alternative to Username Password Credentials Federated Identity Single Sign-On Single Experience WS-Security With SAML Assertions OpenID Connect with JWT ID Tokens Single Sign-On Multi-Experience SAML CAS 授权Authorization 授权意味决定一个身份确定的用户能够访问那些资源。 本质上可以授权可以理解为是访问控制,是系统对访问某些数据或执行某个操作的权限的控制。 Role

ReentrantLock 核心源码解析

怎甘沉沦 提交于 2020-08-10 17:35:55
学习完 AQS,本文我们就来研究第一个 AQS 的实现类:ReentrantLock。 1 基本设计 ReentrantLock 可重入锁,可重入表示同一个线程可以对同一个共享资源重复的加锁或释放锁。 具有与使用 synchronized 方法和语句访问的隐式监视器锁相同的基本行为和语义的可重入互斥锁,但具有扩展功能。 ReentrantLock 由最后成功锁定但尚未解锁的线程所拥有。当另一个线程不拥有该锁时,调用该锁的线程将成功返回该锁。如果当前线程已经拥有该锁,则该方法将立即返回。可以使用 isHeldByCurrentThread 和 getHoldCount 方法进行检查。 此类的构造函数接受一个可选的 fairness 参数。设置为true时,在争用下,锁倾向于授予给等待时间最长的线程。否则,此锁不能保证任何特定的访问顺序。使用多线程访问的公平锁的程序可能会比使用默认设置的程序呈现较低的总吞吐量(即较慢;通常要慢得多),但获得锁并保证没有饥饿的时间差异较小。但是请注意,锁的公平性不能保证线程调度的公平性。因此,使用公平锁的多个线程之一可能会连续多次获得它,而其他活动线程没有进行且当前未持有该锁。还要注意,未定时的 tryLock 方法不支持公平性设置。如果锁可用,即使其他线程正在等待,它将成功。 建议的做法是始终立即在调用后使用try块进行锁定,最常见的是在构造之前/之后

2020-08-08

空扰寡人 提交于 2020-08-10 15:57:02
手把手教你阅读AQS源码(一) 最近准备面试大厂,上天(高并发,分布式)入地(JVM)的技能是必须的,今天抽一下午时间把JUC包下非常基础非常核心非常重要的一个内容AQS做一个总结。 (一)什么是AQS AQS是AbstractQueuedSynchronizer的缩写,是JUC包下的一个同步器框架,它对于原子性同步状态的管理,线程的挂起与唤醒,以及多线程竞争锁的排队等提供了一系列通用的机制。让我们自己可以通过AQS很容易的实现自己的一把定制化锁,包括JUC包下的同步工具CountdownLatch、ReentrantLock、Semaphore等都是通过AQS来进行管理内部的同步状态。具体的介绍可以参考AQS的作者Doug Lea的一篇论文---------(传送门)---------> The java.util.concurrent Synchronizer Framework (二)AQS框架怎么用? 这篇文章笔者会以ReentrantLock为切入点加以代码块和描述的方式对AQS的源码做一个深入浅出的分析,在这之前我们先来看一下AQS源码中作者写的相关注释。 Subclasses should be defined as non-public internal helper classes that are used to implement the