JAVA并发(1)并发编程的挑战

802 阅读2分钟

记得刚开始学JAVA的时候,在并发这一块最薄弱,只能做一些简单的多线程使用和对锁的使用,在其底层压根就没考虑过,最近抽空买了本JAVA并发编程艺术,要仔细认真的学习下。

上下文切换

一次上下文切换就是任务从保存到再加载的过程,因为处理器支持多线程执行代码的通过给每个线程分配CPU时间片来实现的,因为时间片非常短,所以CPU不停的切换线程执行,让我们感觉多个线程是同时执行的。 CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到像任务。在切换前会保存上一个任务的状态,在下次切回这个任务时,再加载这个任务状态。 在并发执行操作没达到数量时,并发执行速度会比串行执行速度要慢。这是因为线程又上下文切换的开销

减少上下文切换

减少上下文切换的方法有无锁并发编程、CAS算法、使用最少线程和使用协程。

  • 无锁并发编程 如将数据的ID按照Hash算法取模分段,不同的线程处理不同段的数据。
  • CAS算法 其中文意思是比较并替换,在Java的Atomic包中,使用CAS算法来更新数据而不需要加锁。
  • 使用最少线程 避免创建不需要的线程,避免创建了很多线程而照成大量线程都处于等待状态。
  • 协程 在单线程里实现多任务的调度,并在单线程里维持多个任务见的切换。

死锁

死锁在我的理解就是, 在一个加锁的线程1中里面需要使用先对象A再使用对象B, 在另一个加锁的线程2中里面需要使用先对象B再使用对象A, 同时启动的话,此时线程1锁住了对象A,线程2锁住了对象B, 导致线程1要等待线程2释放B,同时线程2要等待线程1释放A, 就这样照成了两个线程互相等待对方释放锁

学习来源《Java并发编程艺术》

个人拙见,感谢您的阅读。欢迎讨论,个人博客

JAVA并发(1)并发编程的挑战

JAVA并发(2)synchronized和volatile底层实现原理

JAVA并发(3)锁的状态

JAVA并发(4)原子操作的实现原理

JAVA并发(5)happens-before

JAVA并发(6)重排序

JAVA并发(7)根据JMM分析volatile

JAVA并发(8)final域

JAVA并发(9)深入分析DCL

JAVA并发(10)并发编程基础