
Java 多线程
文章平均质量分 94
Java 多线程学习笔记
GreyZeng
程序员,架构师,项目经理
展开
-
Java 多线程(七):线程池
作者:Grey原文地址:博客园:Java 多线程(七):线程池优快云:Java 多线程(七):线程池线程池内部是通过队列结合线程实现的,当我们利用线程池执行任务时:如果此时线程池中的线程数量小于,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。如果此时线程池中的线程数量等于,但是缓冲队列未满,那么任务被放入缓冲队列。如果此时线程池中的线程数量大于等于,缓冲队列已满,并且线程池中的线程数量小于,建新的线程来处理被添加的任务。如果此时线裎池中的线数量大于,缓存冲队列已满, 并且线程池中的原创 2022-09-12 00:02:55 · 249 阅读 · 0 评论 -
Java 多线程(五):锁(三)
更通俗的讲就是在读锁没有释放的时候是可以获取到一个写锁,获取到写锁之后,读锁阻塞,这一点和读写锁一致,唯一的区别在于。有两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束。Semaphore 是信号量,可以做限流,限制 n 个线程并发,释放一个线程后就又能进来一个新的线程。程序可以并发执行,用线程操作1,2,3,然后操作完毕后再合并, 然后执行后续的逻辑操作,就可以使用。底层原理是:如果没有线程许可可用,则线程阻塞,并通过 AQS 来排队,可以通过。原创 2022-09-11 17:38:28 · 203 阅读 · 0 评论 -
Java 多线程(四):锁(二)
作者:Grey原文地址:博客园:Java 多线程(四):锁(二)优快云:Java 多线程(四):锁(二)需要实际测试一下。示例代码见: Java SE 11 下,运行得到的执行结果是: 可以看到,在大数据量的情况下,LongAdder 的效率最高。关于 LongAdder 的一些说明,参考如下两篇博客:从 LONGADDER 看更高效的无锁实现Java 8 Performance Improvements: LongAdder vs AtomicLong其中“ReentrantReadWriteLock”原创 2022-09-11 08:30:49 · 202 阅读 · 0 评论 -
Java 多线程(三):锁(一)
第二个线程:也把 3 这个数拿过来,线程本地区域做计算加 1 后,在回写回去的时候,会做一次比较,如果原来的值还是 3,那么说明这个值之前没有被打扰过,就可以把 4 写回去,如果这个值变了,假设变为了 4,那么说明这个值已经被其他线程修改过了,那么第二个线程需要重新执行一次,即把最新的 4 拿过来继续计算,回写回去的时候,继续做比较,如果内存中的值依然是 4,说明没有其他线程处理过,第二个线程就可以把 5 回写回去了。因此,即使对象值被反复读写,写回原值,只要时间戳发生变化,就能防止不恰当的写入。原创 2022-09-10 20:09:42 · 298 阅读 · 0 评论 -
Java 多线程(二):并发编程的三大特性
对象 T 在创建过程中,背后其实是包含了多条执行语句的,由于有 CPU 乱序执行的情况,所以极有可能会在初始化过程中生成以一个半初始化对象 t,这个 t 的 m 等于 0(还没有来得及做赋值操作)在从内存中读取数据的时候,根据的是程序局部性的原理,按块来读取,这样可以提高效率,充分发挥总线 CPU 针脚等一次性读取更多数据的能力。,指的就是内存中的某个数据,假如第一个 CPU 的一个核读取到了,和其他的核读取到这个数据之间的可见性。,恢复中断的代价是比较大的,所以我们要想尽办法不让流水线中断。原创 2022-09-09 22:16:43 · 378 阅读 · 0 评论 -
Java 多线程(一):基础
程序是计算机的可执行文件;进程是计算机资源分配的基本单位;线程线程是一个程序里面不同的执行路径,多个线程共享进程中的资源;协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。协程在子程序内部可中断的,然后转而执行别的子程序,在适当的时候再返回来接着执行。原创 2022-09-08 20:32:49 · 481 阅读 · 0 评论 -
Java 多线程(六):容器
SynchronousQueue 也是一个队列,但它的特别之处在于它内部没有容器,一个生产线程,当它生产产品(即put的时候),如果当前没有人想要消费产品(即当前没有线程执行take),此生产线程必须阻塞,等待一个消费线程调用take操作,take操作将会唤醒该生产线程,同时消费线程会获取生产线程的产品(即数据传递)添加元素时会复制一个新的数组,写数据时在新数组上进行,读操作在原数组上进行。允许在写操作时来读取数据,大大提高了读的性能,因此适合读多写少的应用场景,后就被阻塞了,只有消费线程线程进行了消费,原创 2021-11-09 10:04:43 · 377 阅读 · 0 评论