首先java的内存模型有两个特征:
1.visibility 可视性:多进程间数据可以共享。
2.ordering 有序性:对内存进行的操作应该是有序的。
在jvm虚拟机中,有一个主内存,其下所有的线程都共用这个主内存。主内存中放置着这个进程所有的变量。
而在这个进程里的每一个线程都有自己独立的一个工作内存,工作内存里存放着这个线程所需要使用的变量,而这些变量都是主内存中的拷贝。工作进程为每个线程独有,不可与其他线程共享。
当内存需要对某个变量进行操作的时候,首先会从主内存中获取一个变量的拷贝,存放到工作内存当中,然后根据程序需要对变量进行修改。最后再写入主内存,覆盖掉原来的值。但是,如果多个线程共同使用一个变量的时候,就会出现问题。由于cup处理任务采用是来回切换的模式,可能到一个线程刚才修改完工作内存的值以后,还没有来得及去写入主内存,cpu就切换到另个线程运行,而这个线程又读取的是主内存中同一个变量。所以这样就造成了共用数据的错误。俗称线程不安全。
针对这个问题,可以采取的解决办法有:
1.synchronized关键字
2.volatile关键字
3.final变量
4.java.util.concurrent.lock包(since jdk 1.5)
5.java.util.concurrent.atmoic包(since jdk 1.5)