java
文章平均质量分 60
羡云不羡君
这个作者很懒,什么都没留下…
展开
-
spring事务管理中,使用Synchronized修饰事务方法,同步为什么会失效
首先我们的环境是只有一台服务器,一个工程的情况,这种情况下使用synchronized修饰事务方法,同步效果会失效吗?在Controller中,我模拟了5个并发请求保存用户的场景,Service中的保存方法使用了synchronized关键字修饰,运行结果如下:可以看到数据库里面保存了三条相同的数据,这是为什么呢?原创 2023-03-25 16:32:13 · 1285 阅读 · 1 评论 -
Java中的异常
RuntimeException表示编译器不会检查是否对RuntimeException进行了处理,在程序中不必去捕获RuntimeException异常,也不必在方法体抛出RuntimeException异常类。throw 抛出具体的问题对象,执行到 throw,功能就已经结束了,跳转到调用者,并将具体的问题对象抛给调用者。非运行时异常:也叫编译异常,就是Exception下除了RuntimeException以外的异常。是必须进行处理的异常,编译器会进行异常提醒的。分为运行时异常和非运行时异常。原创 2023-03-17 21:26:14 · 681 阅读 · 0 评论 -
JWT Token与session
我们知道,http协议本身是一种无状态的协议,而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证,那么下一次请求时。用户还要再一次进行用户认证才行,因为根据Http协议,我们并不能知道是哪个用户发出的请求,所以为了让我们的应用能够识别是哪个用户发出的请求,我们只能在服务器存储一份用户登录的信息(session),然后在客户端的cookie中保存一份sessionid,客户端以后每次请求都会携带这个cookie到服务器找到对应的session。(为了解决这个问题:我们需要进行集群间的共享。原创 2022-10-14 21:55:01 · 721 阅读 · 0 评论 -
semaphore信号量、CountdownLatch计数等待
信号量,用来限制能同时访问共享资源的线程上限。原创 2022-10-09 19:24:21 · 189 阅读 · 0 评论 -
ReentrantReadWriteLock、StampedLock读写锁
当读取操作远远高于写操作时,这时候使用读写锁让读-读可以并发(即然多个线程的读取是可以并行的),提高性能。类似于数据库中的 select ... from ... lock in share mode提供一个数据容器类,内部分别使用读锁保护数据的read()方法,写锁保护数据的write()方法注意事项:1.读锁不支持条件变量,写锁支持2.重入时升级不支持,即同一个线程第一次获取的是读锁,然后又去获取写锁,会导致获取写锁永久等待(阻塞住了)如下:3.重入时支持降级:即先获取写锁,然后获取读锁。原创 2022-10-07 15:48:50 · 522 阅读 · 0 评论 -
ThreadLocal
1. ThreadLocal是Java中所提供的线程本地存储机制,可以利用该机制将数据缓存在某个线程的内部,该线程可以在任意时刻、任意方法中获取缓存的数据2. ThreadLocal底层是通过ThreadLocalMap来实现的,每个Thread对象(注意不是ThreadLocal对象)中都存在一个ThreadLocalMap,Map的Key为ThreadLocal对象,map的value为需要缓存的值。原创 2022-09-24 18:54:21 · 1021 阅读 · 0 评论 -
线程池概念2
ExecutorService:是一个线程池最基本的接口,提供了提交任务,关闭线程池这些基本的方法。ScheduledExecutorService:扩展接口,在基础线程池的功能上又新增了任务调度的功能,可以用来定时执行任务。原创 2022-09-23 17:58:16 · 303 阅读 · 0 评论 -
JUC并发包下
AtomicStampedReference可以给原子引用加上版本号,追踪原子引用整个的变化过程,如:A -> B -> A -> C,通过AtomicStampedReference,我们可以知道引用变量中途被更改了几次。但是有时候我们有时候并不是想修改引用本身而是想修改对象里面的内容,例如:数组(要对数组里面的元素保证线程安全)* AtomicReferenceArray(保护的数组里面元素是引用类型的)之前的原子引用保护的是多个线程对一个对象引用进行修改时的线程安全性。原创 2022-09-20 17:38:01 · 434 阅读 · 0 评论 -
cas与volatile
在通过cas实现的AtomicInteger类的源代码中,共享的成员变量就有volatile修饰。原创 2022-09-19 13:07:41 · 284 阅读 · 0 评论 -
volatile原理及happens-before规则
因为INSTANCE这个变量没有完全被synchronized保护起来,所以synchronized代码块里面仍然可能会发生指令重排的现象。happens-before规定了对共享变量的写操作对其他线程的读操作可见的问题。t2被t1打断后,t1打断前对共享变量的写对于主线程和t2线程来说是可见的。注意:在isInterrupted()之后。原创 2022-09-18 16:23:43 · 257 阅读 · 0 评论 -
java内存模型-有序性
volatile可以达到禁用的目的。可以达到ready = true;这段代码之前的代码不会排到它之后执行。原创 2022-09-18 12:20:15 · 95 阅读 · 0 评论 -
可见性volatile
JMM即Java Memory Model,它定义了主存(多个线程之间共享的内容)、工作内存(单个线程独自占有的内容)的抽象概念,底层对应着cpu寄存器、缓存、硬件内存cpu指令优化等。JMM体现在以下几个方面。* 原子性:保证指令不受到线程上下文切换的影响。* 可见性:保证指令不会受到cpu缓存的影响。* 有序性:保证指令不会受到cpu指令并行优化的影响。原创 2022-09-17 20:29:25 · 243 阅读 · 0 评论 -
ReentrantLock
可中断(即可以打断一个线程在等待的状态,避免一直等待从而导致的死锁)* 可以设置超时时间(synchronized获取锁时,如果不能获得锁,那么就会进入entryList去等待了,不会说等待一段时间就放弃了。ReentrantLock设置一个超时时间,如果规定时间内获得不到锁就会放弃,从而去执行一些其他的逻辑)* 可以设置为公平锁(而不是让这些线程随机去争抢,是先到先得的一种方式,防止饥饿现象:即有些线程一直抢不到锁)原创 2022-09-17 15:45:18 · 1183 阅读 · 0 评论 -
同步模式之保护性暂停
有一个结果需要从一个线程传递到另一个线程,让他们关联同一个GuardedObject。* 如果有结果不断从一个线程到另一个线程那么可以使用消息队列(见生产者/消费者)即Guarded Suspension,用在一个线程等待另外一个线程的执行结果。* JDK中,join的实现、Future的实现,采用的就是此模式。* 因为要等待另一方的结果,因此归类到同步模式。原创 2022-09-15 12:17:47 · 131 阅读 · 0 评论 -
wait/notify
obj.wait() 让进入object监视器的线程到waitset等待。会释放对象的锁,进入WaitSet等待区,从而让其他线程有机会获取对象的锁。无限制等待,直到notify为止。(想要调用该方法必须是该线程已经拿到锁了,也就是说是该Monitor的Owner了)* obj.wait(long n):有时限的等待,到n毫秒后结束等待,或是被notify.* obj.notify() 在object 上正在waitset等待的线程中挑一个唤醒。原创 2022-09-14 18:52:54 · 118 阅读 · 0 评论 -
java并发-锁
轻量级锁的使用场景:如果一个对象虽然有多线程访问,但多线程访问的时间是错开的(也就是没有竞争),那么可以使用轻量级锁来优化。轻量级锁对使用者是透明的,即语法仍然是synchronizd假设有两个方法同步块,利用同一个对象加锁。创建锁记录(Lock Record)对象,每个线程的栈帧都会包含一个锁记录的结构,内部可以存储锁定对象的Mark Word让锁记录中的Object reference 指向锁对象,并尝试用cas替换Object的Mark word,将Mark Word的值存入锁记录。原创 2022-09-14 09:13:36 · 508 阅读 · 0 评论 -
进程与线程 两阶段终止模式 线程中的一些方法
程序由指令和数据组成,但这些指令要运行,数据要读写,就必须要将指令加载至CPU,数据加载至内存。在指令运行过程中还需要用到磁盘,网络等设备。进程就是用来加载指令,管理内存,管理IO的。* 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。* 进程可以视为程序的一个实例。大部分程序可以运行多个实例(例如:记事本、画图、浏览器等),也有的程序只能启动一个实例进程(例如:网易云音乐、360安全卫士)原创 2022-09-12 15:53:02 · 233 阅读 · 0 评论 -
JWT的结构
令牌的第二部分是有效负载,其中包含声明,声明是有关实体(通常是用户)和其他数据的声明。Signature需要使用编码后的header和payload,以及我们提供的一个密钥,然后使用header中的签名算法(HS256)进行签名,签名的作用是保证JWT没有被篡改过。它会使用Base64编码组成JWT结构的第一部分。-因此,JWT通常如下所示:xxx.yyy.zzz Header.Payload.Signature。-Base64是一种编码,也就是说,它可以被翻译回原来的样子的,它并不是一种加密过程。...原创 2022-08-14 09:56:54 · 210 阅读 · 0 评论 -
线程池概念总结
newCachedThreadPool():每一次执行任务的时候,如果以前的线程可用就会使用以前的线程,如果以前的线程忙就会重新创建一个线程 ,线程的数量没有限制,而且线程空闲到一定时间也会销毁。核心线程数量:当我们有一个任务提交到线程池的时候,如果当前运行的线程的数量没有达到核心线程数量,就会新开一个线程来执行我们的任务。任务队列:当有任务提交到线程池的时候,如果当前线程数量达到了核心线程数量,就会把任务放到这个任务队列里面。后面补充........................3.使用线程池的优势。.原创 2022-08-13 17:16:29 · 263 阅读 · 0 评论 -
文件上传与解析excel文件
前台:通过form表单的方式提交同步请求后台:mvc的配置文件:配置文件上传的解析器controller层:解析excel文件原创 2022-06-16 19:02:27 · 408 阅读 · 0 评论 -
使用apache-poi生成excel文件与同步请求三种方式与文件下载
a)添加依赖:b)使用封装类生成excel文件发同步请求的三种方式:1.地址栏2.超链接3.form表单案例解析:目的:把查询数据库的结果生成excel文件,然后再文件下载第一种方式:先把查询结果生成一个excel文件,然后再把文件写到服务器上(从内存到磁盘的过程),然后通过流的方式把文件输出到浏览器,然后设置响应头信息,使浏览器接收到响应信息之后,直接激活文件下载窗口(路径是浏览器默认的下载路径,如果想改变路径,只需要改变浏览器下载路径就可)注:这种方式效率不高(内存->磁盘,然原创 2022-06-15 16:21:34 · 737 阅读 · 1 评论