Java 线程的创建与同步锁的使用

1.不使用同步锁创建线程

public class ThreadTest {
    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                test("线程1---");
            }
        });
        Thread t2 = new Thread(new Runnable() {

            @Override
            public void run() {
                test("线程2----------------");
            }
        });

        t1.start();
        t2.start();
    }

    static void test(String text) {
        for (int i = 0; i < 100; i++) {
            System.out.println(text + i);
        }
    }
}

运行结果:,线程1与线程2交叉运行,谁先抢占cpu谁就先运行。

2.使用方法级同步锁

public class ThreadTest {
    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                test("线程1---");
            }
        });
        Thread t2 = new Thread(new Runnable() {

            @Override
            public void run() {
                test("线程2----------------");
            }
        });

        t1.start();
        t2.start();
    }

    static synchronized void test(String text) {
        for (int i = 0; i < 100; i++) {
            System.out.println(text + i);
        }
    }
}

运行结果:,线程1先执行,线程2后执行,因为线程1与线程2都执行test(),test()开启了同步锁,所以线程2抢不到cpu,只有等线程1执行完test(),线程2才可以执行test().

3.使用同步代码块进行同步锁

public class ThreadTest {
    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                test("线程1---");
            }
        });
        Thread t2 = new Thread(new Runnable() {

            @Override
            public void run() {
                test("线程2----------------");
            }
        });

        t1.start();
        t2.start();
    }
    static final Object sync = new Object();
    static  void test(String text) {
        synchronized (sync) {
            for (int i = 0; i < 10; i++) {
                System.out.println(text + i);
            }
        }
        for(int i = 0;i<10;i++) {
            System.out.println(text+"同步代码块以外代码");
        }
    }
}

运行结果:

,顾明思议,这种同步锁只锁住synchronized(obj)包裹的代码,以外的代码不进行同步,这种同步锁使用更灵活,注意同步锁synchronized(obj)中的obj必须是相同的对象,否则同步锁不起作用

4.同步代码块错误使用案例:

public class ThreadTest {
    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                test("线程1---");
            }
        });
        Thread t2 = new Thread(new Runnable() {

            @Override
            public void run() {
                test("线程2----------------");
            }
        });

        t1.start();
        t2.start();
    }
    static  void test(String text) {
        synchronized (new Object()) {
            for (int i = 0; i < 10; i++) {
                System.out.println(text + i);
            }
        }
    }
}

运行结果:,这样写毫无意义,因为同步锁住的obj不是同一个,所以同步锁也就不生效了。

猜你喜欢

转载自www.cnblogs.com/dongjingxiang/p/10338483.html