1、POM依赖 spring boot 版本2.5.1 shiro依赖 <spring-shiro.version>1.6.0</spring-shiro.version> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>${spring-shiro.version}</version> </dependency> jwt依赖 <jwt.version>3.3.0</jwt.version> <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>${jwt.version}</version> &.... 有更新! shiro集成jwt(双token机制) 程序人生
异常信息如下: java.lang.NumberFormatException: For input string: "" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[na:1.8.0_281] at java.lang.Long.parseLong(Long.java:601) ~[na:1.8.0_281] at java.lang.Long.valueOf(Long.java:803) ~[na:1.8.0_281] at io.swagger.models.parameters.AbstractSerializableParameter.getExample(AbstractSerializableParameter.java:412) ~[swagger-models-1.5.20.jar:1.5.20] 进入AbstractSerializableParameter类的getExample方法(swagger-models包下) 方法中只进行了NULL.... 有更新! spring boot swagger出现NumberFormatException异常 程序人生
ThreadLocal用在线程中存储线程的变量,每个线程被创建都会有自己的ThreadLocal对象,ThreadLocal对其他线程是不可见的,各个线程维护自己的ThreadLocal变量。 ThreadLocal内部有一个ThreadLocalMap的内部类,其中的Entry存储了当前线程的数据。 static class ThreadLocalMap { /** * The entries in this hash map extend WeakReference, using * its main ref field as the key (which is always a * ThreadLocal object). Note that null keys (i.e. entry.get() * == null) mean that the key is no longer referenced, so the * entry can be expunged from table. Such entries are referred to * as "stale entri.... 有更新! 关于ThreadLocal 程序人生
1、HashMap HashMap使用数组+链表的形式存储,初始化的时候,会根据传入的数组大小,找到一个最接近且大于当前值的2的幂,源码中方法如下: /** * Returns a power of two size for the given target capacity. */ static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; } 对传入的值做无符号右移,然后经行一个或操作,最终得到一个大于传入的值的2的幂。 hashmap是通过数组+链表或红黑树的形式存储数据的 transient Node<K,V>[] table.... 有更新! Java中的Map 程序人生
1、简介 Java有四种锁状态:无锁、偏向锁、轻量锁、重量锁,锁可以逐渐升级,但是不可以降级。 2、锁状态 在Java中对象的锁存储在对象头Mark Word中(该字段存储对象的hashcode或者锁信息) 2.1、偏向锁 2.1.1、获取 当一个线程访问同步代码块并获取锁的时候,会在对象头和栈帧中的锁记录里存储偏向锁的线程ID,以后该线程在进入和退出同步块时,不需要进行CAS加锁和解锁,会查询对象头中Mark Word是否存储着指向该线程的偏向锁,如果成功,表示线程已经获得了锁。如果失败,则需要再测试一下Mark Word中偏向锁的标识是否设置成1(表示当前是偏向锁):如果没有设置,则使用CAS竞争锁;如果设置了,则尝试使用CAS将对象头的偏向锁指向当前线程; 2.1.2、撤销 当其他线程尝试竞争偏向锁时,持有偏向锁的线程才会释放偏向锁。当另一个线程试图访问偏向锁时,会首先暂停拥有偏向锁的进程,如果线程没有运行,则将对象锁的对象头设置为无锁状态。如果线程正在运行,则会暂停该线程,恢复到无锁状态,或者标记对象不适合作为偏向锁,最后唤醒该线程。 2.1.3、优缺点 偏向锁适用于大多数时候.... 有更新! java锁状态基本概念 程序人生
volatile允许线程访问这个共享变量,一个字段被声明为volatile,则java内存模型确保所有线程看到这个变量的值是一致的。 有volatile变量修饰的共享变量进行写操作的时候会触发以下两件事: 1.将当前缓存行的数据写回到系统内存; 2.这个写回内存的操作,使其他处理器缓存的该数据的内存地址失效。 如果对声明了volatile的变量进行写操作,JVM会将这个变量所在缓存行的数据写回到系统内存,之后其他处理器通过嗅探在缓存总线上传播的数据看自己缓存的数据是否过期,当处理器发现缓存行对应的数据被修改,就会将这个数据所在的缓存行设置为无效状态,当处理器对这个缓存行重新进行操作时,会重新从系统内存读取该数据到缓存行。 有更新! 了解下volatile 程序人生