Java同步代码块

什么是同步代码块:

同步代码块是共用同一把锁的代码块,使用同步代码块可以实现两块代码在执行过程中互斥

即执行代码块A的时候不执行代码块B,执行代码块B的时候不执行代码块A。

 

实现方法:

使用静态对象锁。

private static final Object SYNCHRONIZED_OBJECT = new Object();
 

举个栗子:

public class LockDemo{

    /**
     * 静态对象锁
     */
    private static final Object SYNCHRONIZED_OBJECT = new Object();

    public void method1() {
        synchronized (SYNCHRONIZED_OBJECT) {
            System.out.println("method1 start");
            for (int i=1;i<=4;i++) {
                System.out.println("method1:"+i);
                try {
                    Thread.sleep(1000);
                }
                catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
            System.out.println("method1 end");
        }
    }


    public void method2() {
        synchronized (SYNCHRONIZED_OBJECT) {
            System.out.println("method2 start");
            for (int i=1;i<=4;i++) {
                System.out.println("method2:"+i);
                try {
                    Thread.sleep(1000);
                }
                catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
            System.out.println("method2 end");
        }
    }

}
public class TestDemo {

    /**
     * 两个对象共用同一把静态对象锁,分别启用两个线程来执行这两个对象的不同方法,可见两个代码块互斥
     */
    @Test
    public void test1() {
        LockDemo lockDemo1 = new LockDemo();
        LockDemo lockDemo2 = new LockDemo();
        
        ThreadDemo demo1 = new ThreadDemo(lockDemo1,"method1");
        ThreadDemo demo2 = new ThreadDemo(lockDemo2,"method2");
        demo2.start();
        demo1.start();

        try {
            demo1.join();
            demo2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}


/**
 * 线程例子
 */
class ThreadDemo extends Thread{

    LockDemo lockDemo;
    String method;

    ThreadDemo(LockDemo lockDemo,String method) {
        this.lockDemo = lockDemo;
        this.method = method;
    }


    @Override
    public void run() {
        if (method.equals("method1")) {
            lockDemo.method1();
        } else {
            lockDemo.method2();
        }
    }
}

执行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值