java线程遇见的一个小问题(本质和线程无关都是基础知识)

猜猜下面几个程序,那个是线程安全的
NO1
public class Main {
    public static class AddTest extends Thread {
        private static Integer num = 0;
        @Override
        public void run() {
            for (int i = 0; i < 1000; i++) {
                    num = num + 1;
                    System.out.println("now num is " + num);
            }
        }
    }

    public static void main(String[] args) throws Exception {
        for (int i = 0; i < 100; i++) {
            new AddTest().start();

        }
    }
}

NO2
public class Main {
    public static class AddTest extends Thread {
        private static Integer num = 0;
        private static Object lock = new Object();
        @Override
        public void run() {
            for (int i = 0; i < 1000; i++) {
                synchronized (lock) {
                    num = num + 1;
                    System.out.println("now num is " + num);
                }
            }
        }
    }
    public static void main(String[] args) throws Exception {
        for (int i = 0; i < 100; i++) {
            new AddTest().start();

        }
    }
}

NO3
public class Main {
    public static class AddTest extends Thread {
        private static Integer num = 0;
        @Override
        public void run() {
            for (int i = 0; i < 1000; i++) {
                synchronized (num) {
                    num = num + 1;//
                    System.out.println("now num is " + num);
                }
            }
        }
    }
    public static void main(String[] args) throws Exception {
        for (int i = 0; i < 100; i++) {
            new AddTest().start();

        }
    }
}

NO4
public class Main {
    public static class AddTest extends Thread {
        private static Integer num = 0;
        private Integer lock = 0; //-128~127
        @Override
        public void run() {
            for (int i = 0; i < 1000; i++) {
                synchronized (lock) {
                    num = num + 1;
                    System.out.println("now num is " + num);
                }
            }
        }
    }
    public static void main(String[] args) throws Exception {
        for (int i = 0; i < 100; i++) {
            new AddTest().start();

        }
    }
}


1 no
2 yes
3 no num=num+1,会生成另一个对象,锁就不唯一了
4 yes  Integer 会缓存 -128(固定)~127(默认可配置) 的整数,所以无论多少个Integer(0) 都是一个对象

猜你喜欢

转载自shifulong.iteye.com/blog/2244939