![](https://img-blog.csdnimg.cn/20190918140053667.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
java
java相关知识点总结
yiyefuchen
这个作者很懒,什么都没留下…
展开
-
CAS实现SSO单点登录详解
一. 基本概念1. SSO单点登录 (Single Sign-On) 是目前比较流行的服务于企业多系统整合的解决方案之一,使得在多个系统中,用户只需要登录/退出一次就可以访问/退出所有相互信任的应用系统。2. CAS认证中心 (Central Authentication Service) 是SSO的一种实现,Yale大学开源了一个CAS项目(感兴趣的可以自行学习),本文实现了一个简化版的CAS(github源码地址)二. 原理...原创 2020-05-28 13:25:59 · 1376 阅读 · 0 评论 -
JAVA并发工具—CyclicBarrier
今天来介绍一下并发库中的另一个工具——障碍物(CyclicBarrier)/** * 基于ReentrantLock实现,常用方法如下: * 1. CyclicBarrier(3): 设置计数 * 2. await(): 计数减一 * 2.1 如果计数大于0,释放当前线程持有的锁,唤醒下一个等待线程(如果没有执行过2.2,此处应该没有线程可被唤醒),挂起当前线程(condi...原创 2019-12-05 13:46:01 · 85 阅读 · 0 评论 -
JAVA并发工具—CountDownLatch
前面一篇文章Semaphore讲了基于AQS共享锁实现的信号量工具,今天再讲另一个同样基于AQS共享锁实现的计数器工具——CountDownLatch:/** * CountDownLatch基于CAS中的共享锁,常用有如下几个方法: * 1. CountDownLatch(3): 设置共享锁数量 * 2. await(): 检查当前共享锁数量,如果锁数量等于0,就继续执行,反之...原创 2019-12-05 12:51:19 · 121 阅读 · 0 评论 -
JAVA并发工具-Semaphore
再前面一篇文章ReentrantReadWriteLock中讲到用AQS中的共享锁和排它锁实现的读写锁,今天我们再说一个基于AQS共享锁实现的工具信号量——Semaphore:/** * 基于AQS共享锁实现,常用方法如下: * * 1. Semaphore(3): 设置共享锁数量 * 2. acquire(): 获取共享锁,共享锁减一,如果锁数量不够,就放到同步队列中等待 ...原创 2019-12-05 11:41:41 · 255 阅读 · 0 评论 -
JAVA-ReentrantLock(二)
前一篇文章ReentrantLock(一)讲了重入锁的的基本使用,一个线程在获取锁后只能通过释放锁才能让其它线程获取锁。如果一个线程在获取锁后,想要暂时把锁的控制权交出去,然后在适当时间再继续执行(线程间通信),用之前的方法就很难实现。今天我们来看一下重入锁的另一种用法——条件控制(Condition): /** * 用主线程和子线程交替执行50次,主线程先执行,每次执行100次打...原创 2019-12-04 15:33:58 · 74 阅读 · 0 评论 -
JAVA-ReentrantReadWriteLock
之前讲到的ReentrantLock属于排他锁,虽然可以重入多次,但同一时间只允许一个线程获取锁。而今天讲到的ReentrantReadWriteLock维护了一对锁——读锁和写锁。读锁是共享锁,允许多个线程同时持有。读锁是排他锁,同一时刻只能有一个线程持有。通过分离读锁和写锁,使得并发性相比一般的排他锁(ReentrantLock,Synchronized)有很大的性能提升,因为大多数场景中读是...原创 2019-12-04 11:11:32 · 94 阅读 · 0 评论 -
JAVA-自旋锁
https://blog.csdn.net/fuyuwei2015/article/details/83387536转载 2019-12-02 17:16:41 · 95 阅读 · 0 评论 -
JAVA-ReentrantLock(一)
ReentrantLock是一个基于AQS实现的可重入的锁实现,包括公平锁和非公平锁,大量采用非阻塞算法,在中低量(并发量低,锁占用时间短)的并发上效率是非常高的,获取和释放流程图如下:public static void main(String[] args) { Lock lock = new ReentrantLock(); try { ...原创 2019-11-29 13:53:56 · 101 阅读 · 0 评论 -
JAVA-Unsafe
@SuppressWarnings("restriction")public class UnsafeTest { private static final Unsafe unsafe = getUnsafe(); private static final Object obj = new AtomicInteger(10); private static final long ...原创 2019-11-28 16:49:44 · 89 阅读 · 0 评论 -
JAVA-数据结构-HashMap
/** * 哈希表综合了数组和链表的特点,数组称之为哈希桶,每个桶里面放的是链表,链表中的每个节点,就是哈希表中的每个元素 */ // 默认的哈希桶初始化容量,必须是2的幂 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 // 哈希桶最大数量...原创 2019-11-28 16:49:52 · 105 阅读 · 0 评论 -
JAVA-引用
在JDK 1.2之后,Java对引用的概念进行了扩充,将引用分为强引用(strong reference)、软引用(soft reference)、弱引用(weak reference)、虚引用(phantom reference),这4种引用强度一次减弱。1. 强引用强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它,如"Object obj = new Obje...原创 2019-11-21 17:27:11 · 77 阅读 · 0 评论 -
JAVA-动态代理CGLIB
CGLIB动态代理实现也是常用的实现方式,相对于JDK的只能代理接口,CGLIB的可以直接对类进行代理,功能也更多1. 由于实现原理,需要一个类public class OrderService { public String add(String orderNo) { System.out.println("add a order[orderNo=" + orderNo +...原创 2019-11-20 14:24:48 · 248 阅读 · 0 评论 -
JAVA-动态代理JDK
jdk的动态代理实现是常用的方法之一,动态代理相比较于静态代理的好处不言而喻,可以少写大量的代理类,更加便于扩展。下面用一个样例来看一下具体实现:1. 由于实现原理要求,首先需要一个接口public interface OrderService { /** * 添加一个订单 * @param o */ void add(Order o); /** * 删除一个...原创 2019-11-19 13:40:04 · 141 阅读 · 0 评论