使用JWT

1.引入依赖

1
2
3
4
5
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.4.0</version>
</dependency>
Read more »

SpringBoot整合SpringSecurity

https://www.kuangstudy.com/bbs/1369251751735095298

Spring Security课程介绍

Read more »

TDD测试驱动开发

用户提供的信息:

  • 用户昵称(长度最长为20个字节,即最长20个英文单词,10个汉字)(必须传入)

  • 用户性别(1代表男,2代表女)(必须传入)

  • 用户出生日期(格式为YYYY-MM-DD)(必须传入)

  • 用户简介(长度最长为40个字节,即最长40个英文单词,20个汉字)(必须传入)

Read more »

提高代码鲁棒性——(1)

  • 需要 Map 的主键和取值时,应该迭代 entrySet()

当循环中只需要 Map 的主键时,迭代 keySet() 是正确的。但是,当需要主键和取值时,迭代 entrySet() 才是更高效的做法,比先迭代 keySet() 后再去 get 取值性能更佳。

Read more »

代理模式是一种经典的设计模式,代理的意义在于生成代理对象,在服务提供方和使用方之间充当一个媒介,控制真实对象的访问。

代理分为静态代理和动态代理两种。

静态代理需要通过手动或工具生成代理类并编译,代理类和委托类的关系在编译期就已经确定。动态代理允许开发人员在运行时动态的创建出代理类及其对象。

Read more »

异步执行的代码

1
new Thread(r).start();

统一的工具类,定一个接口来实现。

Read more »

基于 ReentrantLock实现一个锁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package aqsLock;

import java.util.concurrent.locks.AbstractQueuedSynchronizer;


/**
* @Author: Kayleh
* @Date: 2021/4/20 0:57
*/
public class aqsLock
{
public void lock()
{
sync.acquire(1);
}

public void unlock()
{
sync.release(1);
}

private final Sync sync = new Sync();

public static class Sync extends AbstractQueuedSynchronizer
{
@Override
protected boolean tryAcquire(int arg)
{
// CAS 方式尝试获取锁,成功返回true,失败返回false
if (compareAndSetState(0, 1))
return true;
return false;
}

@Override
protected boolean tryRelease(int arg)
{
// 释放锁
setState(0);
return true;
}
}
}

基本功能实现,测试:

Read more »

CAS(Compare And Swap)原理分析

字面意思是比较和交换,先看看下面场景(A 和 B 线程同时执行下面的代码):

1
2
int i = 10;	//代码1
i = 10; //代码2
Read more »

深入浅出Map

Map是java里边是一个接口,常见的实现类有HashMap、LinkedHashMap、TreeMap和ConcurrentHashMap

HashMap底层数据结构是数组+链表/红黑树

Read more »
0%