JAVA系列课程
Hollis,阿里巴巴技术专家《Java工程师成神之路》系列文章作者,热衷于分享计算机编程相关技术,博文全网阅读量上千万。
2023年10月26日
一、多线程使用场景并行业务处理可以使用多线程相同业务重复执行可以使用多线程
二.多线程使用方法对于并行业务处理使用多线程的方法:使用CountDownLatch类保证并行业务都处理完毕使用抽象接口,抽象出执行过程,每个并行业务继承抽象接口使用线程池来管理多线程,线程池的大小由并行业务的数量来决定
相同业务重复执行使用多线程的方法:对一个相同的业务实现Runnable接口,作为一个业务多线程实现类使用线程池来管理多线程,线程大小不宜过大根据一定的均分算法来分配到不同的线程执行
三.volatile变量能保证线程间的可见性,其他线程对变量修改能及时反应到当前线程中使用volatile变量,编译器会保证其有序性
四.synchronized关键字对象锁和类锁在修饰方法时默认是当前对象作为锁的对象在修饰类时默认当前类的Class对象作为锁的对象对象锁是控制实例方法之间的同步,而类锁是用来控制静态方法之间的同步对象锁每个对象一把锁、互不影响,类锁对个对象共用一把锁
synchronized+wait()/notify()用法
五.ReentrantLock重入锁ReentrantLock提供了公平锁和非公平锁两种,公平锁对锁的获取是先进先出,非公平锁可以插队
六.ReadWriteLock读写锁现实中有这样一种场景:对共享资源有读和写的操作,且写操作没有读操作那么频繁。在没有写操作的时候,多个线程同时读一个资源没有任何问题,所以应该允许多个线程同时读取共享资源;但是如果一个线程想去写这些共享资源,就不应该允许其他线程对该资源进行读和写的操作了。 针对这种场景,JAVA的并发包提供了读写锁ReentrantReadWriteLock,它表示两个锁,一个是读操作相关的锁,称为共享锁;一个是写相关的锁,称为排他锁,描述如下:线程进入读锁的前提条件:没有其他线程的写锁,没有写请求或者有写请求,但调用线程和持有锁的线程是同一个。线程进入写锁的前提条件:没有其他线程的读锁没有其他线程的写锁而读写锁有以下三个重要的特性:(1)公平选择性:支持非公平(默认)和公平的锁获取方式,吞吐量还是非公平优于公平。(2)重进入:读锁和写锁都支持线程重进入。(3)锁降级:遵循获取写锁、获取读锁再释放写锁的次序,写锁能够降级成为读锁。
七.ThreadLocal线程局部变量1、ThreadLocal不是线程,是线程的一个变量,你可以先简单理解为线程类的属性变量。2、ThreadLocal在类中通常定义为静态变量。3、每个线程有自己的一个ThreadLocal,它是变量的一个“拷贝”,修改它不影响其他线程。既然定义为类变量,为何为每个线程维护一个副本(姑且称为“拷贝”容易理解),让每个线程独立访问?多线程编程的经验告诉我们,对于线程共享资源(你可以理解为属性),资源是否被所有线程共享,也就是说这个资源被一个线程修改是否影响另一个线程的运行,如果影响我们需要使用synchronized同步,让线程顺序访问。ThreadLocal适用于资源共享但不需要维护状态的情况,也就是一个线程对资源的修改,不影响另一个线程的运行;这种设计是‘空间换时间’,synchronized顺序执行是‘时间换取空间’。
2023年10月26日
一、ThreadLocal定义ThreadLocal为线程局部变量,ThreadLocal所定义的变量属于当前线程,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每个线程都可以独立改变自己的副本,而不会影响其它线程所对应的副本。
二、ThreadLocal实现原理ThreadLocal在不同线程之间数据是隔离的(不同的实例副本,实例副本通过ThreadLocalMap来实现),在同一个线程中不同方法和不同类之间是可以共享的在不同的线程中的TreadLocal变量是存放在不同的ThreadLocalMap(静态内部类)中,ThreadLocalMap的存储结构为key、value结构(threadlocal,value)Thread的key对应的是threadlocal,通过对threadlocal值进行hachcode计算(计算规则:key.threadLocalHashCode...
2023年10月23日
一、HashMap的数据结构
HashMap是基于哈希表的Map接口的实现。它使用哈希表来存储键值对。这使得获取特定键的值变得非常快。每个键值对被存储在一个称为“桶”的结构中。桶的数量是固定的,但当HashMap增长时,这些桶会被重新分配到一个更大的数组中。
HashMap的内部结构包括数组和链表。当两个不同的键具有相同的哈希值时,它们会被存储在同一个桶中,但是作为链表的不同节点。
二、红黑树在HashMap中的应用
在Java...
2023年10月20日
1.top 命令查看
查看是哪个进程占用cpu过高,如图是pid为25835的进程占用了很高的cpu资源,此处应该服务器是多核的,所以才会出现占用cpu为200%
2.top...
2023年10月17日
一、目的
对于项目关键接口、数据敏感接口等,采用安全等级更高的加密处理,防止抓包拦截、数据篡改、数据包伪造等操作
二、具体实现
实现过程如下:
1.Web客户端启动,发送请求到服务端,服务端用RSA算法生成一对公钥和私钥,我们简称为pubkey1,prikey1,将公钥pubkey1返回给web客户端
2.Web客户端拿到服务端返回的pubkey1后,自己用RSA算法生成一对公钥和私钥,我们简称为pubkey2,prikey2,并将公钥pubkey2、特殊处理的时间戳(相关位运算)通过公钥pubkey1加密,加密之后传输给服务端
3.此时服务端收到web客户端传输的密文,用私钥prikey1进行解密,因为数据是用公钥pubkey1加密的,通过解密就可以得到客户端生成的公钥pubkey2
4.服务端生成AES密钥,生成了这个key之后我们就用公钥pubkey2进行加密,返回给web客户端,因为只有web客户端有pubkey2对应的私钥prikey2,只有web客户端才能解密,web客户端得到数据之后,用prikey2进行解密操作,得到AES的加密key,最后就用加密key进行数据传输的加密,至此整个流程结束。
图示如下:
客户端不保存密钥key,需要的时候通过请求来获取,这样基本能保证密钥key被盗用的可能性
服务器的密钥key可以通过配置来更换,防止长时间固定不变
2023年10月17日
一、什么是幂等性
幂等性:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用
二、分布式系统中哪些地方需要注意幂等性
(1)用户在使用产品时,可能会误操作触发多次,或者长时间无响应触发多次
(2)Kafka消息重复,生产者可能会出现消息发送情况,消费者也可能出现重复消费情况
(3)系统的重试机制,业务可能为了考虑失败的情况,出现多次重试,如Fegin调用、回调方法处理
三、需求
一个用户对于同一个操作发起一次或者多次的请求,请求的结果一致,不会因为多次点击而产生多条数据,接口可重复调用,在调用方多次调用的情况下,接口最终得到的结果是一致的
四、实现方案
2.1...