多线程安全
文章平均质量分 90
多线程
去北极避暑~
这个作者很懒,什么都没留下…
展开
-
【多线程案例】设计模式-单例模式
假设有两个线程t1,t2,由于if判断并没有加锁,两个线程是可以同时判断的,如果t2线程刚好在t1线程判断instance为nullt1线程进入new之前或还没new完时t2进行if判断,也是会创建多个实例对象的, 这就导致虽然new的时候加了锁线程是顺序执行的,但new外面的逻辑线程还是随机调度的。执行1->2->3顺序使我们希望的,但若是执行1->3->2顺序,执行到3时,对象虽然不是null了,但是此时的对象还没有初始化,贸然使用是非法的。此时若按照衣服,玩具,首饰,菜这种顺序效率是最高的。原创 2023-10-08 15:28:13 · 579 阅读 · 0 评论 -
【多线程】JUC(java.util.concurrent)的常见类 信号量 线程安全的集合类
这个包里的内容主要是一些多线程,并发编程相关的组件。1.Callable接口,也是一种创建线程的方式。适合于想让某个线程执行一个逻辑,并且返回一个结果。相比之下,我们熟悉的Runnable(创建任务时常用)不关注结果。Callable接口使用时需要额外搭配一个FutureTask类。相同点:都是用来定义一个任务,从而去创建出一个线程。:在执行方法的时候,将传入的Callable对象或者Runnable对象封装成FutureTask对象,核心作用是获取有返回值的线程结果。原创 2023-10-17 08:21:01 · 103 阅读 · 0 评论 -
【多线程】锁策略
上述锁策略中,乐观锁,轻量级锁,自旋锁是一组锁,可以说存在一定联系。悲观锁,重量级锁,挂起等待是一组锁,存在一定联系。原创 2023-10-12 21:06:18 · 144 阅读 · 0 评论 -
【多线程案例】Java实现线程池
线程诞生的意义是因为进程的创建与销毁太重量了,也耗时,与进程相比,线程是更快了,但是如果进一步提高创建销毁的频率,线程的开销也不能忽略。两种典型的解决办法:第一种是使用协程(轻量级线程),相比于线程,把系统调度的过程给省略了。第二种就是要讲的线程池。原创 2023-10-11 10:14:54 · 292 阅读 · 0 评论 -
【多线程案例】Java实现简单定时器(Timer)
在日常生活中,如果我们想要在 t 时间 后去做一件重要的事情,那么为了防止忘记,我们就可以使用闹钟的计时器功能,它会在t时间后执行任务(响铃)提醒我们去执行这件事情. — 这就是Java定时器的简单功能。它作为一种日常开发组件。约定一个时间,时间到达之后,执行某个任务。常被用于网络通信。原创 2023-10-10 12:56:01 · 305 阅读 · 0 评论 -
【多线程案例】阻塞队列,实现生产者消费者模型
比如服务器和客户端之间的请求与响应,当用户量请求增大时,服务器也会受牵连,甚至于 将服务器弄崩溃给挂了,耦合性较高,如果两者之间用一种数据结构如队列存储请求,就不论客户 端用户量请求有多大时,服务器仍然可以按照自己的速度去处理请求。:当把阻塞队列封装成单独的服务器程序,部署到特定的机器上,这个时候就把这个队列称为"消息队列"。阻塞队列是多线程代码中比较常用的一种数据结构。是一种特殊的队列,带有阻塞特性。并发协作的模型,在分布式系统里非常常见。原创 2023-10-09 19:48:30 · 343 阅读 · 0 评论 -
【多线程安全】线程的调度顺序 wait和notify
但是使用join方法,只能等调用方法的线程结束,我们所希望的是一种既能实现线程之间的顺序执行,也能让调用线程不结束。活锁:是指线程1可以使用资源,但它很礼貌,让其他线程先使用资源,线程2也可以使用资源,但它很绅士,也让其他线程先使用资源。活锁:马路中间有条小桥,只能容纳一辆车经过,桥两头开来两辆车A和B,A比较礼貌,示意B先过,B也比较礼貌,示意A先过,结果两人一直谦让谁也过不去。我们都知道多线程的调度顺序是随机的,系统随机调度,抢占式执行,很多时候,也是希望能够通过一定的手段进行顺序执行的。原创 2023-10-08 14:56:58 · 123 阅读 · 0 评论 -
【多线程安全】死锁 锁竞争总结
或者,不加 volatile ,给循环里加个 sleep 也行,原因是加了sleep之后,while循环的执行速度变慢了,这样load操作的开销就不大了。为了解决这个变慢问题,提高效率,此时编译器就可能会对代码做出优化,即把一些本来要度内存的操作,优化成读取寄存器了,这样就会减少读内存的操作,也就会提高整体程序的效率了。此时就是发生内存可见性问题,即编译器通过优化读取操作,把读内存优化成都寄存器了,而改变后的值在却内存中,虽然是读速度变快了,但是有可能也就不准了,这样的优化操作也无疑会使预期结果出错。原创 2023-10-06 14:42:39 · 1494 阅读 · 23 评论 -
【多线程编程】创建线程的几种方式
解耦合,即就是 实现Runnable 会把任务存在runnable的run方法中,如果要执行此任务,再创建线程进行调用,这样,任务就不会单独属于某个进程,而是创建的进程都可以去调用。原因是interrupt()唤醒线程之后,sleep()方法抛出异常,同时会自动清除刚才设置的标志位。lambda本质上是一个匿名函数,并且使用lambda表达式的前提是接口为函数式接口,何为函数式接口,即。所谓变量捕获,匿名内部类有,lambda也有,即就是访问所在方法或代码块中的。,这个过程被称为"变量捕获"。原创 2023-10-05 11:59:22 · 330 阅读 · 15 评论 -
【多线程】进程与线程 并发编程
早期的CPU都是单核的,随着多核CPU的到来,多进程也随之出现,但在并发编程当中,多进程虽然效果也可以,但是也有缺点,进程太重量且效率不高(进程的创建与销毁,耗时,耗内存资源)。线程是操作系统的概念。由于不同操作系统所提供的API不太相同,于是Java的JVM对这些操作系统所提供的API,统一进行了封装。 程序是一些指令的有序集合,而进程是程序执行的过程,进程是程序的一次执行过程。进程的状态是变化的,其包括进程的创建、调度和消亡。 进程:是动态的,是运行在内存中的程序的执行实例。原创 2023-10-04 17:07:01 · 1476 阅读 · 11 评论 -
【多线程练习】· 累加count 顺序打印 死锁
所谓的死锁就是线程一拥有锁1,线程二拥有锁2,双方在拥有自身锁的同时尝试获取对方的锁,最终两个线程就会进入无线等待的状态,这就是死锁。每个线程循环 1w 次,累加变量 count 的值,count 默认值为 0,注意线程安全问题。需要让他们同时启动,并按 c,b,a的顺序打印。有三个线程,线程名称分别为:a,b,c。使用两个线程来累加 count 的值。有三个线程,分别只能打印A,B和C。要求按顺序打印ABC,打印10次。每个线程打印自己的名称。原创 2023-09-19 20:45:07 · 92 阅读 · 0 评论