原子性:原子是不可再分割的最小单元,原子性是指一个或多个操作要么全部执行成功,要么全部执行失败。
可见性:一个线程对共享变量的修改,另一个线程能看到(synchronized,volatile)
有序性:程序的执行顺序按照代码的先后顺序
线程安全的问题原因有:
- 线程切换带来的原子性问题
- 缓存导致的可见性问题
- 编译优化带来的有序性问题
解决方案:
根本区别:进程是操作系统资源分配的基本单元,而线程是处理器任务调度的和执行的基本单位。
内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的。
分为用户线程与守护线程
用户(User)线程:运行在前台,执行具体任务,如程序的主线程,连接网络的子线程都是用户线程。必须执行完才会结束。例如,main主线程。
守护(Daemon)线程:运行在后台,为其它前台线程服务,也可以说守护线程是JVM非守护线程的”佣人“,一旦所有用户线程都执行结束,守护线程会随着JVM一起结束运行。例如,垃圾回收线程。
只需破坏形参死锁的四个必要条件之一即可。
当前任务执行完,CPU时间片切换到另一个任务之前会保存自己的状态,以便下次再切换会这个任务时可以继续执行下去,任务从保存到再加载执行就是一次上下文切换。