1.与线程相关的栈的问题
(1)栈是用来调用方法的,局部变量在栈区,每个线程有自己的栈区,局部变量在线程之间是不能共享的。
(2)堆、常量池、方法区中的数据在线程之间是共享的。
(3)有共享数据,线程安全才能出现问题。
2.线程安全
(1)定义:如果多线程环境下代码运行的结果符合单线程环境运行的结果,则说这个程序是线程安全的。
3.线程不安全的原因
(1)线程之间交错运行;
(2) 没存区域的数据不一致;
3.1.原子性(atomic)–在一段代码执行完成之前不能被中断
(1)原子性锁表现出的现象:同步互斥,表示操作是相互排斥的;
(2)一条java语句不一定是原子的,也不一定只是一条指令;
(3)常见的原子性表现形式:
(4)不保证原子性带给多线程的问题:
如果一个线程正在对一个变量操作,中途其他线程插入进来了,如果这个操作被打断,结果就可能是错误的。
3.2.可见性(visible)
(1)主内存-工作内存