线程在程序中是独立的,并发的执行路径,每个线程都有自己的堆栈,自己的局部变量,程序计数器
一个进程中的多个线程共享相同的内存地址空间,这就意味着他们可以访问相同的变量和对象,而且他们从同一堆
中分配对象,尽管这让线程之间共享信息变得很容易,但是应该确保他们不会妨碍同一进程中的其他线程,确保相互之间不会干扰。
threadlocal是在进程地址空间存储的,但是它只与某线程绑定,其他线程不知道怎样访问。
每个 Java 程序都至少有一个线程 ― 主线程。当一个 Java 程序启动时,JVM 会创建主线程,并在该线程中调用程序的 main() 方法。
JVM 还创建了其它线程,您通常都看不到它们 ― 例如,与垃圾收集、对象终止和其它 JVM 内务处理任务相关的线程。其它工具也创建线程,如 AWT(抽象窗口工具箱(Abstract Windowing Toolkit))或 Swing UI 工具箱、servlet 容器、应用程序服务器和 RMI(远程方法调用(Remote Method Invocation))。
volatile(不稳定的)关键字修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值写回到共享内存。这样,在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
JAVA语言规范中指出,为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。这样,当多个线程同时与某个对象交互时,就必须注意 要让线程及时得到共享成员变量的变化。
而,volatile关键字就提示JVM,对于这个成员变量,线程不能保存它的私有拷贝而应直接与共享成员变量交互。
使用建议:在两个或者更多线程访问的成员变量上使用volatile,当要访问的变量已在synchronized代码块中,或者为常量时,不必
使用。
由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。