Java并发编程学习笔记(一)

一.多线程一定比单线程快吗?

在《Java并发编程艺术》开篇中提到,若操作数据量不超过百万次,那么并发执行是比串行执行慢的。是因为线程有创建和上下文切换的开销。

  • 那么什么是上下文切换呢
    单核CPU支持多线程执行,但是它并不是像我们想象的那样是同一时间执行多个线程,而是通过对每个线程进行时间片的分配,以至于不停的切换线程执行。从而让我们感觉CPU是在同时执行多个线程。也就是说其实在一个时间片内,CPU执行的只是一个线程。但是,在两个时间片之间切换线程的时候CPU会保存上一个任务的状态,以便下次切换回这个任务时,可以再次加载这个任务的状态,从任务保存到再加载的过程就是一次上下文切换

二.既然上下文切换会导致额外的开销,那么怎么减少上下文的切换?

  • 无锁并发编程:
    定义:无锁编程是指在不使用锁的情况下,在多线程环境下实现多变量的同步。即在没有线程阻塞的情况下实现同步。这样可以避免竞态、死锁等问题。
    推荐下面一篇博客,个人感觉讲的还是比较详细
    无锁和无等待的定义和例子
  • CAS算法:
    CAS是一种无锁算法,CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。
    同样在这推荐一篇较好的博客:
    深入理解CAS算法原理
  • 使用最少线程:避免创建不需要的线程
  • 协程:在单线程里实现多任务的调度,并在单线程里维持多个任务之间的调度

三.避免死锁的几个办法

  • 避免一个线程同时获取多个锁
  • 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占一个资源
  • 尝试使用定时锁来代替内部锁机制
  • 对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况

你可能感兴趣的:(并发学习笔记)