![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java基础
文章平均质量分 57
Shen_Li_Java_ing
加电!加电!!加电!!!
展开
-
token的原理,机制
token其实也是一样的,是当客户端第一次发起请求时,服务器通过签名生成的一连串字符串,这个字符串只有服务器自己明白什么意思,别的人拿到也是一头雾水,甚至连客户端自己都不知道是什么意思。客户端再次发送请求时,一般会将token发在自己的请求头中,服务端收到请求后,会先去验证客户端发送的token是否与自己签发的token一致,如果一致则响应请求,如果不一致则拒绝请求。当然如果你如果只想做个系统自娱自乐,我就自己用,并不想让别用,那么通过数据库查询的方式完全是可以的,但是,一个公司做个项目不可能自娱自乐吧?原创 2024-07-01 21:48:10 · 393 阅读 · 0 评论 -
反射会打破单例模式吗
为了避免这种情况,一种可能的解决方案是使单例类的构造器抛出异常(如果检测到已经有一个实例存在),或者在创建实例时检查是否已经有实例存在。因此,在设计单例模式时,需要考虑到反射可能带来的风险,并考虑使用其他机制(如枚举单例)来增强单例的安全性。单例模式确保一个类只有一个实例,并提供一个全局访问点。然而,通过Java反射API,我们可以绕过私有构造器和静态变量,从而可能创建类的多个实例,进而破坏单例模式的约束。,这表明通过反射我们成功地绕过了单例模式的限制,并创建了多个实例。类的实例,并验证它们是否相同。原创 2024-04-25 19:29:28 · 1487 阅读 · 3 评论 -
Integer缓存池知道吗?
所以这里还有个面试题,就是啥 Integer 127之内的相等,而超过127的就不等了,因为127之内的就是同一个对象,所以当然相等。实现的原理是int在自动装箱的时候会调用Integer.valueOf,进而用到了IntegerCache。因为根据实践发现大部分的数据操作都集中在值比较小的范围,因此Integer搞了个缓存池,不仅Integer有,Long 也是有的,不过范围是写死的-128到127。对了Float和 Double是没有滴,毕竟是小数,能存的数太多了。原创 2024-04-23 22:57:02 · 426 阅读 · 0 评论 -
JAVA中的IO模型详解
IO(Input/Output),也就是输入和输出的简称,从计算机结构的角度来看,IO,就是输入数据到计算机中,计算机输出数据到计算机外,下面有一张十分经典的冯·诺伊曼结构图,将计算机分为五大部分:运算器、控制器、存储器、输入设置、输出设备。输入设备向计算机输入数据,输出设备接收计算机输出的数据。所以,从计算机结构的角度来看IO,IO就是描述了计算机系统和外部设备之间通信的过程。接下来我们再从应用程序的角度去了解一下IO:在操作系统中,为了保证操作系统的稳定性和安全性,一个进程的地址空间被划分为了用户空间(原创 2024-04-23 22:54:43 · 848 阅读 · 0 评论 -
聊一聊ConcurrentHashMap和HashTable
在 JDK1.6 中,对 synchronized 锁的实现引入了大量的优化,并且 synchronized 有多种锁状态,会从无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁一步步转换。如下图所示,首先将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一段数据时,其他段的数据也能被其他线程访问,实现了真正的并发访问。将锁的级别控制在了更细粒度的哈希桶数组元素级别,也就是说只需要锁住这个链表头节点(红黑树的根节点),就不会影响其他的哈希桶数组元素的读写,大大提高了并发度。转载 2024-04-22 21:53:59 · 79 阅读 · 0 评论 -
聊一聊HashMap
在JDK1.8之后,采用的是锁分离,用到的技术是CAS+synchronized,对单独的桶下标上锁,使得锁粒度更细。,HashMap的演进其实就是线程安全问题的解决,锁粒度的细分,HashMap没有锁,hashTable锁全表,CurrentHashMap根据不同的版本分为JDK1.8之前和之后,分别锁的是segment分段和桶下标。,确定桶的位置,之后通过key与桶的元素key值依次进行equals比较如果不相同,则判断是否有链表或红黑树,再通过相应的方法继续比较,如果相同,则对value进行替换。原创 2024-04-22 20:58:16 · 788 阅读 · 1 评论 -
String,stringBuffer,stringBuilder有什么区别?
之间的主要区别在于线程安全性。在多线程环境下,如果你需要确保字符串拼接的线程安全,应该使用。StringBuilder不是线程安全的,里面的方法没有synchronized。stringBuffer线程安全,里面的方法基本上都有synchronized。进行大量字符串拼接时,性能可能会受到影响,因为每次拼接都会生成新的。而在单线程环境下,为了获得更好的性能,你可以使用。进行了字符串的拼接操作。你可以注意到,当使用。则不会这样,它们可以在原有对象上进行修改。在上面的代码中,我们分别使用。原创 2024-04-15 17:06:30 · 247 阅读 · 1 评论