Java并发编程
文章平均质量分 60
三心二意 雨露均沾 ——这就是java并发
vcaml7717
不要辜负命运的托付
展开
-
【JUC】CountDownLatch
因为我们在多线程中经常要遇到一类场景就是你要等所有线程全部工作之后 才能往下走。比如你要等所有线程都获取数据 获取完整之后 装到一个集合里面往下走。这是一个多线程里面非常好用,也非常重要的工具类。然后将latch 作为每一个线程的参数。当一个线程执行完任务后让他-1。count 对应你的任务数量。然后就可以继续往下执行了。新手一定要使用熟练。原创 2023-05-31 22:14:09 · 47 阅读 · 0 评论 -
【JUC】ReentrantLock
顾名思义是可重入锁。它是synchronized的进化版,提供了对锁更灵活的控制。(乍一看像redis里面的分布式锁对吧,写个lock方法 里面写setnx)给个简单的例子 体会一下和synchronized的不同。它和 synchronized 有什么异同呢?而不是用synchronized{}去包裹。这种在控制锁粒度方面会更灵活一点。它获取锁和释放锁是通过调用方法。原创 2023-05-31 19:21:41 · 32 阅读 · 0 评论 -
synchronized锁的优化 轻量级锁 锁膨胀 自旋锁 偏向锁
当一个线程访问一个同步块时,如果该同步块未被锁定,虚拟机会将对象头部的标记位设置为“轻量级锁”状态,并将当前线程的Thread ID记录在对象头部的指针中。是指将轻量级锁转换为重量级锁的过程。膨胀为重量级锁的过程包括操作系统级的线程阻塞和唤醒,涉及到操作系统的上下文切换,这对性能会有一定的影响。当一个线程请求获取锁时,如果锁已经被其他线程占用,该线程不会立即阻塞挂起,而是在一个循环中不断地进行自旋(空转)等待,尝试获取锁。如果自旋等待的线程自旋一段时间后仍未获取到锁,那么轻量级锁就会膨胀为重量级锁。原创 2023-05-31 19:36:17 · 64 阅读 · 0 评论 -
synchronized 锁的使用
你也可以 synchronized 修饰方法 比如搞一个add()方法 把i++封装。所以这时候 我们用 synchronized 加锁 让这个操作具备原子性。但是这个count是integer类型 他是一个对象 而不是一个基础类型。可以看到我们创建了一个静态对象实例,用它来当锁。因为 i++ 这个操作不是原子性操作。这里就会有问题 你虽然给count加锁。但是你会发现 每次得到的是一个随机数。还记得经典的单例模式是怎么写的吗?它可能会出现两个线程同时操作了。这种情况下就是线程安全的。原创 2023-05-31 02:57:52 · 33 阅读 · 0 评论 -
线程池的原理和实践【1】
在多线程编程中,创建和销毁线程是一项开销较大的操作,而线程池可以提前创建一组线程,并通过重复利用这些线程来执行任务,从而减少线程的创建和销毁次数,提高系统性能。提供任务排队和拒绝策略:当线程池的工作队列已满时,可以根据配置的拒绝策略来处理新提交的任务,例如丢弃、抛出异常或阻塞等。控制并发度:通过控制线程池的大小和工作队列的容量,可以限制并发执行的任务数量,防止系统资源被过度占用。提高响应性:线程池可以并发执行多个任务,提高系统的响应速度。降低资源消耗:通过复用线程,减少线程创建和销毁的开销。原创 2023-05-25 06:47:03 · 21 阅读 · 0 评论 -
线程池的理解和实践【2】
既然现成的都有了 为什么还要自定义???这个问题对大佬们来说 很简单 但是对第一次接触多线程的新手来说会困惑。我们还是坚持 《照顾新手》 原则自定义线程池大小的需求可能源于特定的应用场景和性能考虑。尽管Java提供了一些现成的线程池实现,但在某些情况下,自定义线程池大小可能更适合满足应用程序的需求。自定义的线程池我们可以自由的设计 每一个参数 按我们想要的 实现定制化。大家平时应该打过 LOL CSGO 星际争霸 之类的。我们打游戏的时候 经常干一件事情 就是改键。原创 2023-05-25 11:31:44 · 21 阅读 · 0 评论 -
线程池的理解和实践【3】
在之前例子里面 我创建线程池 参数只有四个,还有两个是线程工厂和拒绝策略。这里的线程工厂作为参数的意义就是可以让我们自定义线程的创建:比如 自定义线程的名称。自定义线程的优先级。改变线程是否为守护线程等等我们就在上一篇的基础上改thread . setName("定制化名称");//优先级 return thread;} });原创 2023-05-25 16:55:58 · 37 阅读 · 0 评论 -
【并发基础】理解并发编程中的基本概念
(这个词充分体现了 中英双语的翻译错乱性。很长一段时间我都很迷 到底什么是上下文。线程在执行过程中会有自己的运行条件和状态##上述概念是并发编程世界的基石。如果你想更深入的走下去,请务必理解它们。原创 2023-05-22 16:59:26 · 27 阅读 · 0 评论 -
【并发基础】理解线程的各种基本操作
很多情况下,线程之间的协作,和真实生活中的情况非常相:比如你去茶颜悦色买果茶,打包的那个员工必须要等制作的员工给你把饮料调好了之后才能打包。最重要的部分来了: 这两个方法并不是可以随意调用的,线程必须使用synchronized先取得obj对象的锁,或者换一种描述 先取得对象的监视器,才能执行wait,之后再释放这个监视器。而是给目标线程发送一个通知,告知目标线程有人希望你退出!注意:当一个线程调用了obj对象的notify()方法,这时候有很多个线程都调用了obj.wait处于等待的状态。原创 2023-05-22 16:56:28 · 29 阅读 · 0 评论 -
【并发基础】线程的生命周期
在线程的生命周期中,它要经过创建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)这五种状态。线程切换的如此之快,区分这两种状态就没什么意义了。),线程即进入就绪状态。阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态。运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。原创 2023-05-22 16:50:21 · 32 阅读 · 0 评论