在每个进程的内存空间中都会有一块特殊的公共区域,通常称为堆(内存)。进程内的所有线程都可以访问到该区域,这就是造成问题的潜在原因。
3种无同步方案:
- 私有的东西就不该让别人知道 操作系统会为每个线程分配属于它自己的内存空间,通常称为栈内存,其它线程无权访问。局部变量(方法中的变量,会在每个线程的栈内存中都分配一份)
- 人人有份 按照主流编程语言的规定,类的成员变量不能再分配在线程的栈内存中,而应该分配在公共的堆内存中。那怎么保证在公共区域的东西安全呢?答案就是,人人有份。ThreadLocal(就是把堆内存中的一个数据复制N份,每个线程认领1份,同时规定好,每个线程只能玩自己的那份,不准影响别人的。这N份数据都还是存储在公共区域堆内存里的。)
- 只能看,不能摸 这种情况就属于,只能读取,不能修改。其实就是常量或只读变量,它们对于多线程是安全的,想改也改不了。final
同步方案:
- 悲观锁-互斥锁 公共区域(堆内存)的数据,要被多个线程操作时,为了确保数据的安全(或一致)性,需要在数据旁边放一把锁,要想操作数据,先获取锁再说吧
- 乐观锁-假设我的数据不会被意外修改,如果修改了,就放弃,从头再来。 CAS(Compare And Swap)。就是在并发很小的情况下,数据被意外修改的概率很低,但是又存在这种可能性,此时就用CAS。CAS中的ABA问题,加版本号解决。
Come from OneNote…