1.原子性
原子性表示线程在操作变量时,要不全部成功,要不全部失败,没有中间状态。也就是说现在有两个线程,线程A,线程B。线程A在对data变量做++(或者其他)操作的时候,线程B是没有办法影响到线程A的这个操作。只有当线程A做完了这个操作之后,线程B才能够对data变量做其他的操作。
但是比较遗憾的是,因为在多线程中,线程操作都是都是工作内存中的变量数据,在这种线程隔离的情况下,是不具备原子性的。也就是说线程A跟线程B是同时可以操作data变量。如线程A在对data变量做“++”操作的时候,线程B同样可以对data变量做“++”操作。所以我们需要借助其他的方式来保证原子性。
2.可见性
可见性指当一个线程修改了共享变量的值,其它线程能够立即得知这个修改。java 内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值来实现可见性的。
Java提供了volatile关键字来保证可见性。当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。
另外,通过synchronized和Lock也能够保证可见性,synchronized和Lock能保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中。
3.有序性
有序性指的是从源代码到编译运行的过程中,会有多种重排序的指令发生。重排序的目的是为了更快的去执行代码,提高代码效率。但是在多线程的情况下,胡乱的重排序会导致最终的运行结果跟原始代码运行的结果不一样。这样的代码部署到生产环境很容易造成重大事故。而有序性就是为了解决这种问题,禁止重排序来保证程序的顺序执行。