多线程专栏
文章平均质量分 92
从入门到深入讲解多线程知识点
十二分精神~
就算将来一无所有,我也不缺重头再来的勇气
展开
-
锁策略(乐观锁/悲观锁、自旋锁/互斥锁、读写锁、CAS算法、ABA问题)
比如,现在有一个内存M,有两个寄存器 A,B,假设CAS 相当于是一个函数,M,A,B是函数的三个参数,CAS(M,A,B),如果 M 和 A 相同,就将 B 和 M 进行交换,说是交换,其实也就是一种赋值效果,因为,主要关心的是内存中 M 的值,而没人会关心 B 的值,同时整个操作返回 true,如果 M 和 A 不同,就什么事也不做,同时整个操作返回 false,Java中的悲观锁和乐观锁是一种锁的思想,并不是一种具体的锁,所以以下的内容,都是在讲解锁的思想,请读者不要和具体的锁产生混乱;原创 2024-07-27 20:33:37 · 993 阅读 · 0 评论 -
阻塞队列、生产者消费者模型、阻塞队列的模拟实现等干货
1、阻塞队列是线程安全的2、带有阻塞特性: a.向队列中添加元素时,如果队列满了,就会阻塞等待,直到其他线程从队列中取走元素时才会解除等待 b.从队列中向外拿元素时,如果队列为空,就会阻塞等待,直到其他线程向队列中添加元素后,才会解除等待。原创 2024-03-06 22:40:23 · 852 阅读 · 0 评论 -
wait() 、notify()、notifyAll() 的详细用法
首先,我们知道,线程的执行顺序是随机的(操作系统随机调度的,抢占式执行),但是有时候,我们并不喜欢这种随机的执行,更喜欢的是它们能够顺序的执行,所以,Java就引入了一种机制,wait() 和 notify() ,它们的而前面的文章中也讲过一个方法,也是能影响线程的执行顺序,但是呢,这个join只能控制线程结束的顺序,而我们想要的是,线程不结束,也能按照我们自己规定的顺序去依次执行;原创 2024-03-05 22:19:37 · 1553 阅读 · 0 评论 -
volatile关键字的作用 以及 单例模式(饿汉模式与懒汉模式的区别及改进)
因为访问一个变量时,CPU就会先把变量从内存中读出来,然后放到CPU寄存器中进行运算;运算完之后,再将新的数据在内存中进行刷新;对于操作系统来讲,原创 2024-03-04 00:42:20 · 916 阅读 · 0 评论 -
synchrosized 的可重入特性、死锁、哲学家就餐问题以及解决死锁的方法等干货
例如:让线程1先获取 lock1,线程2获取 lock2,然后在 thread1 的内部再尝试获取 lock2,在 thread2 的内部再尝试获取 lock1。以上虽然时嵌套加锁的,但是并未形成环路,得到lock1锁的线程执行,未获得lock1的线程阻塞等待,并且也无法获得lock2。**那么,问题就来了,如果加两次锁,在 }2 的地方是否应该解锁呢?第一点和第二点是锁的特性,如果想要解决死锁,就要破坏第三点和第四点,在Java中,如果一个线程对同一个锁连续加锁两次,不会造成死锁现象。原创 2024-03-03 00:12:44 · 575 阅读 · 0 评论 -
如何解决线程安全问题(synchronized、原子性、产生线程不安全的原因,锁的特性,加锁的方式等等干货)
那么我们修改一下代码:将thread1的join放在thread1的start后面,最后运行的结果就是对的!!!这个。原创 2024-03-02 23:47:36 · 954 阅读 · 0 评论 -
什么是后台线程?线程是否存活?线程的中断、join() 等待线程 以及 线程状态 等等干货
通过代码可以看到,想要休眠1000 毫秒,却休眠了1005秒,因为:系统会按照1000这个时间来控制线程的睡眠,等达到1秒后,就会唤醒线程,就会使线程从阻塞状态转化为就绪状态,但是呢,当线程转换为就绪状态后,并不是说就会直接去CPU上执行,这中间会有一个“调度开销”,所以,在时间上,就会和我们预期的不一样。在上述代码中,因为sleep() 的原因,所以抛出了异常,当Thread发出中断信号时,正在处于休眠的线程就会被强制唤醒,唤醒之后,sleep() 就会抛出异常,但是线程并没有终止,而是继续执行;原创 2024-02-29 00:18:11 · 901 阅读 · 0 评论 -
Java中几种常见的创建线程的方式
上述结果就可以看到,两个线程分别在执行自己的代码,这也就印证了每一个线程都是一个单独的”执行流“, 本来在运行时只有一个执行流,但是遇见 thread.start() ,就开始了兵分两路”同时执行“, 就达到了并发编程的效果,而这里的并发指的是”并行+并发“, 因为,程序员在写代码的时候,是无法感知到这两个线程到底是在一个CPU核心上调度执行还是在两个CPU核心上同时执行, 所以在宏观上也就是我们人的肉眼看着都是在同时执行的,这一点在进程那篇文章中已经讲解的很清楚了。也就没有实现”并发编程”;原创 2024-02-28 23:31:02 · 274 阅读 · 0 评论 -
进程基础知识(什么是进程?什么是 pid/内存指针/文件描述符表?以及进程的状态,进程的优先级,进程的记账信息,进程的上下文,虚拟地址空间等等)
早期的操作系统,是一个“单任务操作系统”(单核CPU),同一时刻只能有一个进程运行,如果想要运行下一个进程,就需要先退出上一个进程,,而进程要执行,就是需要CPU来执行上面的指令,但是对于单核CPU来说,一个CPU核心,同一时刻只能执行同一个进程的指令,这里也可以进行一个比喻,把CPU核心比喻一个舞台,进程比喻成一个演员,一个演员舞台上表演时,其他演员不能去干扰;通过上述方式,把进程之间给隔离开了,进程之间就无法互相访问,交互数据,但是,如果某个需求中,需要多个进程之间相互配合,那该怎么办呢?原创 2024-02-27 22:15:09 · 882 阅读 · 0 评论 -
线程基础知识(线程的概念,线程与进程的区别等)
比如有一家公司,现在要到银行去进行 财务转账、贷款、办理社保等等业务,公司就派了张三去完成,但是呢,由于业务比较多,张三一个人完成起来就非常的费时间,所以就喊来了李四和王五帮忙,这样效率就会高很多,所以公司就好比是一个进程,张三、李四、王五就好比是三个执行流(线程),虽然它们各自都在完成不同的任务,但分配一个业务员(一份资源)也可以同时为他们服务,因为归根结底它们都是在为同一家公司工作,与上篇文章中的进程大大不相同,上一个文章中举了取钱的例子,读者可以去看一下就会茅塞顿开了;这之间有没有这要那个的顺序;原创 2024-02-27 21:38:01 · 783 阅读 · 0 评论 -
常见的锁策略详细讲解(悲观锁 vs 乐观锁,轻量锁 vs 重量锁,自旋锁 vs 互斥锁,公平锁 vs 非公平锁,读写锁等)
本篇文章详细讲解了各种锁策略,以及代码的演示,有需要的小伙伴请认真查阅!!!原创 2024-01-02 15:44:03 · 1024 阅读 · 0 评论