谁能帮我解释一下这是什么情况。
————————————————————————————————————————public class MyTest extends Thread{
public static void main(String[] args) {
new MyTest().start();
new MyTest().start();
}

public void run(){
Singleton singleton=Singleton.getInstance();

try{
sleep(1000);
singleton.test();
}catch(InterruptedException e){

}
}
}
————————————————————————————————————————
public class Singleton {
private static Singleton singleton=new Singleton();
private int no;

private Singleton(){
this.no=0;
}

public static Singleton getInstance(){
return singleton;
}

public void test(){
for(int i=0;i<10;i++){
System.out.println(no);
no++;
}
}
}
————————————————————————————————————————
结果:
0
1
2
3
4
5
6
7
8
9
0——————————谁能解释下这里为什么不是10?
11
12
13
14
15
16
17
18
19谁能告诉我原理 谢谢
多线程单例模式javaSingleton

解决方案 »

  1.   

    ——————————————————————————————————————————
    public class Singleton {
    private static Singleton singleton=null;
    private int no;

    private Singleton(){
    this.no=0;
    }

    public static Singleton getInstance(){
    if(singleton==null){
    synchronized (Singleton.class) {
    if(singleton==null){
    singleton=new Singleton();
    }
    }
    }
    return singleton;
    }

    public void test(){
    for(int i=0;i<10;i++){
    System.out.println(no);
    no++;
    }
    }
    }
    得出的结果是一样的
      

  2.   

    ——————————————————————————————————————————
    public class Singleton {
    private static Singleton singleton=null;
    private int no;

    private Singleton(){
    this.no=0;
    }

    public static Singleton getInstance(){
    if(singleton==null){
    synchronized (Singleton.class) {
    if(singleton==null){
    singleton=new Singleton();
    }
    }
    }
    return singleton;
    }

    public void test(){
    for(int i=0;i<10;i++){
    System.out.println(no);
    no++;
    }
    }
    }
    得出的结果是一样的test方法加个锁
    public synchronized void test(){
    for(int i=0;i<10;i++){
       System.out.println(no);
    no++;
    }
    }
      

  3.   

    把单例里面的类的no
    private int no;改成
    public static int no;就是10了
      

  4.   


    ______________________________________
    原来的no 就是static的,也会出现上面的情况
      

  5.   

    ——————————————————————————————————————————
    public class Singleton {
    private static Singleton singleton=null;
    private int no;

    private Singleton(){
    this.no=0;
    }

    public static Singleton getInstance(){
    if(singleton==null){
    synchronized (Singleton.class) {
    if(singleton==null){
    singleton=new Singleton();
    }
    }
    }
    return singleton;
    }

    public void test(){
    for(int i=0;i<10;i++){
    System.out.println(no);
    no++;
    }
    }
    }
    得出的结果是一样的test方法加个锁
    public synchronized void test(){
    for(int i=0;i<10;i++){
       System.out.println(no);
    no++;
    }
    }————————————————————————————
    想点引用的,不小心扔了块砖,不好意思啊…………
    结果是没有问题的
    但如果每次调用这个方法都要同步的话,代价是不是很大呀。有没有更牛逼,实际可行的方法或者思路呢。
    其实我更想知道no再次初始化之后的数据怎么还会正常接着10往后跑。
      

  6.   

    private transient int no;试试呗?
      

  7.   


    好吧,我错了,这样还是有问题的。。
    参考了CopyOnWriteArrayList的写法,虽然用特别的关键字volatile transient修饰数组,但是在涉及线程安全的地方,还是使用了synchronized关键字修饰了方法。
      

  8.   

    ——————————————————————————————————————————
    public class Singleton {
    private static Singleton singleton=null;
    private int no;

    private Singleton(){
    this.no=0;
    }

    public static Singleton getInstance(){
    if(singleton==null){
    synchronized (Singleton.class) {
    if(singleton==null){
    singleton=new Singleton();
    }
    }
    }
    return singleton;
    }

    public void test(){
    for(int i=0;i<10;i++){
    System.out.println(no);
    no++;
    }
    }
    }
    得出的结果是一样的
    synchronized在这里有什么关系??完全没用啊,你加到test()方法上去试试