一、上下文切换
答案是不一定,根据测试结果,当数据小于百万的时候并发并没有串行快,这是为什么那?单核处理器的多线程并发,其实就是CPU个每个线程分配时间片,当时间片执行完就需要切换另一个线程的时间片来执行,时间片是非常小的单位,所以我们会觉得是并发!而他们发生切换的时候需要保存当前状态,然后在切换,而保存在切换之后的重新加载就是上下文切换,这也是比较浪费时间的!
- 使用无锁并发编程,没有锁的话就会减少线程之间的竞争,从而减少上下文切换!
- 使用CAS算法,使用CAS更新值无需加锁!
- 使用最少线程,尽量减少线程的时候从而避免上下文切换!
- 协程,可以试试单线程维护多个任务的切换!
二、死锁
线程之间都拿着对方需要的资源,并且都不是释放资源,从而导致死锁!例如两个共享资源A和B,第一个线程先拿到A后锁住A,准备拿B,但是在第一个线程准备拿B的时候,第二个线程已经拿到B并且锁住,然后准备去拿资源A,这时候就发生了死锁了!这就是死锁!
- 避免一个线程获取多个锁
- 避免一个线程同时占用多个资源
- 使用定时锁,例如
lock.tryLock();
- 使用数据库锁,加解锁都是在一个数据库连接当中!