多线程
文章平均质量分 83
²º¹⁷旧人不必等
别叹气,运气会跑掉的
展开
-
锁策略, cas 和 synchronized 优化过程总结
锁策略, cas 和 synchronized 优化过程总结原创 2023-08-05 10:48:31 · 348 阅读 · 21 评论 -
synchronized总结
如果竞争进一步激烈, 自旋不能快速获取到锁状态, 就会膨胀为重量级锁 执行加锁操作, 先进入内核态在内核态判定当前锁是否已经被占用 如果该锁没有占用, 则加锁成功, 并切换回用户态.如果该锁被占用, 则加锁失败. 此时线程进入锁的等待队列, 挂起. 等待被操作系统唤醒.经历了一系列的沧海桑田, 这个锁被其他线程释放了, 操作系统也想起了这个挂起的线程, 于是唤醒 这个线程, 尝试重新获取锁。修饰的类或对象的所有操作都是原子的,因为在执行操作之前必须先获得类或对象的锁,直到执行完才能释放。原创 2023-08-03 11:31:33 · 415 阅读 · 7 评论 -
死锁的成因和解决方案
这段随机的等待时间让其它线程有机会尝试获取相同的这些锁,并且让该应用在没有获得锁的时候可以继续运行(加锁超时后可以先继续运行干点其它事情,再回头来重复之前加锁的逻辑)。如果五位哲学家在完全相同的时刻进入餐厅,并同时拿起左边的餐叉,那么这些哲学家就会等待五分钟,同时放下手中的餐叉,再等五分钟,又同时拿起这些餐叉。吃东西的时候,他们就停止思考,思考的时候也停止吃东西。线程1先获取锁A再获取锁B, 线程2先获取锁B再获取锁A, 线程1在获取锁B的时候等待线程2释放B,同时线程2在获取锁A的时候等待线程1释放A。原创 2023-08-02 18:11:26 · 2524 阅读 · 12 评论 -
HashTable, HashMap, ConcurrentHashMap 总结
HashMap是Java中的一个数据结构,它实现了Map接口。HashMap通过一个哈希表来存储key-value键值对,并且支持高效地添加、删除和查找操作。在HashMap中,key和value可以为任何非空对象,而且可以为null。HashMap的特点包括:快速访问,高效的插入和删除,非线程安全。HashMap也是Java中最常用的集合之一。HashTable是Java中的一个数据结构,也实现了Map接口。它与HashMap相似,都是通过哈希表来存储键值对。然而,HashTable是线程安全的,它的各种原创 2023-08-02 17:15:48 · 223 阅读 · 3 评论 -
JavaEE进程调度的基本过程
JavaEE进程调度的基本过程原创 2023-05-27 16:15:24 · 85 阅读 · 4 评论 -
进程和线程的区别和联系
进程是操作系统资源分配的基本单位, 进程是指正在运行的程序实例。每个进程都有自己的内存空间、代码、数据和资源。操作系统通过管理进程来控制计算机的资源分配。每个进程都有一个唯一的标识符,称为进程 ID,以便操作系统可以识别和管理它。进程可以与其他进程通信,并且可以启动其他进程以执行不同的任务。。原创 2023-07-08 21:46:09 · 89 阅读 · 1 评论 -
Thread类的基本用法
所以此时如果我们想让新线程先执行 我们就需要使用Thread类的join方法,这个方法是可以规定哪一个线程先执行的,还是这个代码我们在主线程中加一行代码,就可以让新的线程先执行,新的线程执行完然后执行主线程,注意,哪个在哪个线程中加入这个方法,就是让线程进行等待(阻塞状态)在上面这个代码中 ,创建了一个新线程,那先执行新的线程还是执行主线程,答案是不确定,先执行谁都是有可能的,此时的新线程和主线程是并发(并行+并发)执行的,而系统的调度是无序的,所以先执行哪一个线程都有可能。在这种方法中,等待线程调用。原创 2023-07-09 22:51:27 · 78 阅读 · 2 评论 -
Java 线程的几种状态
:当线程因为某些原因无法运行时,例如等待某个资源、等待 IO 完成等,它处于阻塞状态。如果调用 sleep()、 suspend()、 wait()等方法,线程都将进入堵塞状态。就绪状态(READY):当线程已经准备好被调度执行,但是当前没有分配到 CPU 时间片时,它处于就绪状态。):当线程对象被创建时,它处于新建状态,此时系统已经为该线程分配了必要的资源,例如线程栈等。):当线程因为某个条件而需要等待时,例如等待某个锁、等待某个信号量等,它处于等待状态。3、造成线程阻塞后,线程回到哪个状态了?原创 2023-07-10 15:30:45 · 145 阅读 · 4 评论 -
线程安全问题的原因和解决方案
循环了很多次 此时我们的编译器便做出了优化 ,不再重复读取内存上的值 ,只读取一次放在CPU中 , 这样过后我们的t2即便改变了flog的值 , 但是由于t1不在读取内存上的值 , 所以我们的循环没有停下来, 此时,volatile就能发挥作用了。如果一个进程或线程正在执行时,出现了一些特殊情况(如I/O请求、中断请求等),操作系统就会暂时中止当前进程或线程的执行,切换到其他进程或线程的执行,以便处理这些请求。我们的预期是,当t2修改了flog的值之后,使flog不再为0,此时跳出循环,线程t1结束。原创 2023-07-10 17:38:08 · 121 阅读 · 4 评论