随笔分类 - 并发编程
摘要:管程 一般要实现多线程同步有两种解决方案,分别是信号量和管程原语,信号量通过PV操作可以很方便的实现线程间的互斥操作,如果拿到信号量的许可后才能执行线程处理,但是信号量使用有个弊端就是在业务代码中有大量的PV方法要编写,如果在某个地方处理了P但是没有使用V进行释放,那么其他线程就会阻塞无法执行下去。
阅读全文
摘要:可重入独占锁 ReentrantLock 可重入的意思是在同一线程中可用多次获取同一把锁而不阻塞,独占锁则是只能被一个线程使用。 如下代码所示,我们有8张票,要用10个线程去抢,肯定会出现两个线程抢不到,但是实际运行结果由于多个线程读到同一个值然后去执行业务操作,就会出现超卖的问题 public c
阅读全文
摘要:并发安全 线程安全性 多线程在执行过程中,执行结果总是出乎意料的,无法保证代码的执行正确。 如下是线程不安全的代码,我们的预期执行结果是150000,但是它每次运行的结果都不一样,所以这个代码有线程安全问题。 package com.lyra; import java.util.concurrent
阅读全文
摘要:CAS 原子性 一组操作不允许被其他线程打断被称为原子性。 synchronized关键字可以实现原子性,只要拿到锁才会进入synchronized,被synchronized关键字引用的语句不会被其他线程打断, 那么为什么有了synchronized关键字还要搞个CAS,这就有点多次一举了。原因是
阅读全文
摘要:由于创建线程需要资源和时间,所以并不是线程越多,执行指令速度越快。 使用线程池的好处: 1. 效率变高。 直接使用线程池执行Java代码,执行时间如下所示 ```Java Long start = System.currentTimeMillis(); final Random random = n
阅读全文
摘要:并发与并行 并发 在早期单核CPU中,没办法同时运行多条指令,只能将多个应用程序分成不同的时间片,由于时间片切换的速度很快,所以看起来就像是多个应用程序同时运行。并发就是一个时间点只有一条指令再执行。 并行 在现代cpu中有了多核多线程的概念,可以在不同的核心中执行不同的指令,不需要切换时间片。并行
阅读全文