1. 多线程和单线程比较
(1) 单线程是顺序运行的,运行起来结果是可控的,在运行的一瞬间就已经知道了运行出来的结果。
多线程是一起跑的,没有已知的先后顺序,近乎于完全随机,所以结果并不可控。
线程安全就是即便是在多线程运行下,也能够保证结果的绝对确定。
(2) 加锁和线程同步
实际上加锁线程同步等各种手段,就是把多线程用某种方式变成单线程,把不确定的执行路线变成一条确定的路径。(执行路径的两条线就变成了一条线)
而利用加锁带来的问题,就在于:原来多线程是用来加速的,结果你给变成单线程了,安全倒是安全了,就是慢了不少。
解决
首先是控制加锁的持有时间,跟公共资源不沾边的一概不管,前置后置通通不管。
减小锁的粒度,管理的事情尽可能减少,一个电影院有两个电影,复仇者联盟和侏罗纪世界,买票的时候尽量一个电影一个锁,各管各的。
锁分离,对读写锁进行分离,如果是读的话可以多个线程去读取,如果写的话只能一个线程去写,这种。
锁种类:
公平锁就是大家一起排队,谁先来就先轮到谁。
不公平锁就是插队的,乐观锁形式,谁抢到了归谁,抢到了的自己锁上。
CAS就是这种乐观锁,利用一系列的处理器指令,性能很好。但是CAS只适用于几个线程排队的情况,如果很多个线程共同竞争比如一千个,那么大多数线程其实是获得不到锁的,它是利用循环不断地重复一切的操作,各种前置全都重复执行一遍直到获得锁,对CPU占用很高的。如果是synchronized操作那么CPU会把锁挂起,然后其他线程就只重复执行获得锁这一个操作,对CPU利用率就低了。
网友评论