类加载带来的数据不一致的”坑“

原创 2018年04月17日 00:16:20

首先观察下面代码,并想下输出结果是什么

public class SinglePattern{

    private static SinglePattern instance = new SinglePattern();//在类的装载就直接实例化
    public static int a;
    public static int b = 2;

    private SinglePattern(){
        a++;
        b++;
    }
    public static SinglePattern getInstance() {
        return instance;
    }

    public static void main(String[] args) {
        SinglePattern ins = SinglePattern.getInstance();
        System.out.println("a:="+ins.a);
        System.out.println("b:="+ins.b);
    }
}

上面就是一个单例模式呗

然后我不做任何修改,改变类实例化的一行代码的位置,想想输出结果是什么?

public class SinglePattern{

    public static int a;
    public static int b = 2;

    private static SinglePattern instance = new SinglePattern();//在类的装载就直接实例化

    private SinglePattern(){
        a++;
        b++;
    }
    public static SinglePattern getInstance() {
        return instance;
    }

    public static void main(String[] args) {
        SinglePattern ins = SinglePattern.getInstance();
        System.out.println("a:="+ins.a);
        System.out.println("b:="+ins.b);
    }
}

想到结果了没??

第一个运行结果为:
这里写图片描述

第二个运行结果为:
这里写图片描述

WTF?

就改变一行代码的位置,没有其它大的改动,就结果不一样了!!

其实这是类加载过程产生的问题,对类加载过程详细了解。可以参考:https://blog.csdn.net/weijifeng_/article/details/79894742

对于两个代码分析详解

1 .准备阶段

instance = null;
a = 0;
b = 0;

2 .初始化阶段

new SinglePattern() ; a = 1; b = 1;
public static int a;  a没有指定值,就是上一步的1
public static int b = 2; b有指定初始值,准备阶段时,b = 2;

所以这就是第一种执行结果为a = 1, b = 2的原因了

1 .准备阶段

instance = null;
a = 0;
b = 0;

2 .初始化阶段

public static int a;  a没有指定值,就是上一步的0
public static int b = 2; b有指定初始值,准备阶段时,b = 2;   
new SinglePattern() ; a = 1; b = 3;

这就是产生结果不一样的原因了!
类加载的准备阶段和初始化阶段都严格执行自己的工作,并且在初始化阶段,严格按照指令从上到下的顺序就行内存值分配

所以在了解装载的过程,就应该清楚自己取什么阶段的值,保证取值不会发生错误

数据库并发操作带来的数据不一致性

丢失修改,不可重复读,读“脏”数据
  • when_less_is_more
  • when_less_is_more
  • 2017-03-16 20:55:49
  • 1756

并发操作与数据的不一致性

最近做的《选修课系统》需要考虑这样一个问题:数据库的并发操作带来的数据库数据不一致问题——因为是全校性选修课,同一时间点大批学生选课,那么必然存在多名学生同时对同一数据进行操作 是的问题,如果这种并发...
  • hanxuemin12345
  • hanxuemin12345
  • 2014-03-21 19:50:55
  • 8092

数据库系统原理教程 第八章 数据库并发控制

第八章数据库并发控制     一、选择题 1.为了防止一个用户的工作不适当地影响另一个用户,应该采取(D)。 A. 完整性控制       B. 访问控制  C. 安全性控制     ...
  • wwj_748
  • wwj_748
  • 2012-12-29 20:35:59
  • 2436

多线程带来的数据不一致

解决:两种方法 1同步快import java.util.Random; public class Test13 { /** * @param args * 多线程带来的数...
  • tanggao1314
  • tanggao1314
  • 2015-11-04 21:26:12
  • 887

数据库中的并发操作带来的一系列问题及解决方法

数据库中常见的并发操作所带来的问题包括:丢失的修改、不可重复读、读脏数据、幻影读(幻影读在一些资料中往往与不可重复读归为一类)。 丢失修改 下面我们先来看一个例子,说明并发操作带来的数据的不一致性问...
  • zengxiangxuan123456
  • zengxiangxuan123456
  • 2016-05-10 12:59:44
  • 1345

并发操作导致数据库不一致性

主要是一致性问题.常见并发并发一致性问题包括:丢失的修改、不可重复读、读脏数据、幻影读(幻影读在一些资料中往往与不可重复读归为一类).答案补充   不可重复读是指事务T1读取数据后,事务T2执行更新操...
  • u014511737
  • u014511737
  • 2015-09-12 22:19:05
  • 1632

主从不一致场景分析及如何避免

master库写redo、binlog不实时丢数据的场景redo的ib_logfile与binlog日志如果被设置非实时flush,就有可能存在丢数据的情况: redo未写入磁盘,但binlog写入磁...
  • lijingkuan
  • lijingkuan
  • 2017-04-11 23:41:31
  • 572

IL2Cpp深坑之WeakReference

使用IL2Cpp方式打包后会开启多线程,由此WeakReference便产生了一个隐藏的问题。...
  • ZhangDi2017
  • ZhangDi2017
  • 2017-03-03 00:31:44
  • 725

数据库并发操作会带来哪些问题及原因

(1)丢失更新         当两个或多个事物读入同一数据并修改,会发生丢失更新问题,即后一个事物更新的结果被前一事务所做更新覆盖 即当事务A和B同事进行时,事务A对数据已经改变但并未提交时B又对...
  • echo_sy
  • echo_sy
  • 2017-03-20 20:52:54
  • 3883

数据库实验六

  • 2014年03月23日 20:45
  • 174KB
  • 下载
收藏助手
不良信息举报
您举报文章:类加载带来的数据不一致的”坑“
举报原因:
原因补充:

(最多只允许输入30个字)