java并发编程
文章平均质量分 95
知识
sqyaa.
已在谷底,怎么走都是向上
展开
-
ReentrantLock &信号量&CountDownLatch&多线程环境使用集合类ArrayList和ConcurrentHashMap
ReentrantLock 也是一个可重入锁,使用了lock和unlock方式加锁解锁,使用效果上和 synchronized 是类似,1. ReentrantLock,在加锁的时候,有两种方式. lock, tryLock.给了更多的可操作空间lock(): 加锁, 如果获取不到锁就死等.trylock(超时时间): 加锁, 如果获取不到锁, 等待一定的时间之后就放弃加锁.原创 2024-02-21 11:58:54 · 1021 阅读 · 0 评论 -
synchronized原理&Callable接口
synchronized加锁的时候,并不是真正的加锁,而是先进入偏向锁状态,就相当于做一个标记,如果一直没有别的线程来获取这个锁,那么就不会升级,仅仅只做个标记,因为这个变量本来就只有这个线程要使用,过程也没有出现锁竞争,执行完synchronized{}代码块后,再取消掉标记(偏向锁)即可。但是,如果很快就释放锁了,自旋是值得的,可以立即获取被释放的锁,反之,迟迟不被释放,那么久迟迟拿不到锁,自旋就不划算了..这时候就需要再次升级了!相当于"懒汉模式"提到的懒加载一样,非必要,不加锁。原创 2024-02-21 11:58:15 · 1153 阅读 · 0 评论 -
常见锁策略以及CAS
是典型的重量级锁,指当一个线程尝试获取锁时,如果锁已被其他线程占用,则该线程将会被挂起(即阻塞,阻塞的开销很大),直到锁可用为止。CAS 操作是原子性操作,它可以保证在多线程环境下对共享数据的操作是线程安全的。一个线程针对同一把锁连续加锁两次如果不会出现死锁就是可重入锁,sychronized就是可重入锁,其中引入计数器,并对锁的持有线程进行身份标识,当发现当前加锁的线程就是持有锁的线程就直接进行+1操作。是典型的轻量级锁,是一种忙等的锁,当一个线程尝试获取自旋锁时,如果锁已被其他线程占用,该线程会一直。原创 2024-02-21 11:57:23 · 809 阅读 · 0 评论 -
线程池,,
线程池,事先把需要用的线程创建好,放到线程池中,后面需要使用的时候,直接从池中获取,如果用完了,就还给线程池,这两个操作是比创建线程/销毁线程要更加高效的。原创 2024-02-17 17:43:32 · 557 阅读 · 0 评论 -
volatile,wait和notify,懒汉模式和饿汉模式,阻塞式队列,定时器
方法中的变量是存放在栈中的,每一个线程都有自己的内存空间,即使是同一个方法,被不同的线程掉用,这里的局部变量还是会处在不同的栈空间上,本质上还是不通的变量。线程的最大问题就是抢占式执行,随机性调度,我们需要控制线程之间的执行顺序,虽然线程在内核的调度都是随机的,但是可以通过一些api让线程主动阻塞,主动放弃cpu。,再让t2干,就可以让t2先wait(阻塞,主动放弃cpu),等t1干的差不多了,再通过notify通知t2,唤醒t2,让t2继续干。变量的最新值到线程的工作内存中,原创 2023-06-19 22:07:29 · 666 阅读 · 2 评论 -
线程的状态,多线程带来的风险,synchronized关键字及死锁问题
去破坏死锁中的必要条件中的任意一个(除了互斥条件),给锁编号,然后制定一个固定的顺序(从小到大)来加锁,任意线程加多把锁的时候,都让线程遵循上述循序,此时循环等待自然破除原创 2023-05-25 18:40:21 · 1270 阅读 · 10 评论 -
初始计算机操作系统——进程与线程,多线程以及Thread类的创建和属性
进程重在资源申请与释放,线程是包含在进程中的,一个进程中包含多个线程,共同用同一份资源(同一份内存+文件),只是在创建进程的第一个线程的时候(由于要分配资源,成本是相对高的)。早期的操作系统,里面的进程都是访问同一个内存的地址空间,如果有一个进程出现bug,把内存的数据写错了,就可能引起其他进程崩溃。(同一个进程中的若干线程之间,共享着内存,资源,文件描述符表, 每一个线程被调度执行都有自己的状态,上下文,记账信息);)),这件事情成本是比较高的如果需要频繁的调度进程,这件事成本也是比较高的,原创 2023-05-17 22:06:48 · 774 阅读 · 11 评论