②synchronized同步代码块

2018-10-13  本文已影响0人  YNZXGWZM
  1. synchronized同步锁
package com.mc.testThread;

public class MySynchronized {

    /**
     * 同步锁释放的场景:
     * 1.线程执行完成
     * 2.当前线程有异常 比如 1/0;
     * 两个线程调用同一把锁才可以同步,不同的锁互不影响(两个人上一个厕所,和两个人上两个厕所的区别)
     * @param args
     */
    public static void main(String[] args) {
        MySynchronized mySynchronized1 = new MySynchronized();
        MySynchronized mySynchronized2 = new MySynchronized();
        //开启一个线程
        new Thread("thread1") {
            @Override
            public void run() {
                try {
                    synchronized (mySynchronized1) {
                        System.out.println(this.getName() + "开始工作了");
                        int i=1/0;
                        Thread.sleep(5000);
                        System.out.println("线程睡醒了");
                        System.out.println("线程结束了");
                    }

                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }.start();
        new Thread("thread2") {
            @Override
            public void run() {
                synchronized (mySynchronized1) {
                    System.out.println(this.getName() + " start");
                    System.out.println(this.getName() + " end");
                }

            }
        }.start();

    }
}

运行结果:

Exception in thread "thread1" thread1开始工作了
thread2 start
thread2 end
java.lang.ArithmeticException: / by zero
    at com.mc.testThread.MySynchronized$1.run(MySynchronized.java:22)

Process finished with exit code 0

线程1开始工作,执行到 1/0的时候,报异常,立马释放锁,线程2开始执行。

上一篇下一篇

猜你喜欢

热点阅读