synchronized用法

一。synchronized是保证线程安全的一种方法。它实现的功能有两种锁:

1.对象锁

(1)synchronized修饰成员方法

例如:

    public synchronized void run(){
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

这时候的锁是以当前方法所属的类的实例添加的。

(2)用synchronized修饰代码块,并用对象加锁

    public void run(){
        synchronized (this){
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

这时候的锁是以this对象为锁添加的,this对象也可以是开发人员new的其他对象。这里用this,那么所就是调用该方法的对象本身。

2.类锁

(1)synchronized修饰类成员方法

    public static synchronized void run(){
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

这时候的锁对象是该静态方法所在的类*.class对象。

(2)用synchronized修饰代码块,并用*.class加锁

    public void run(){
        synchronized (Test.class){
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

这时候的所对象是Test.class。这里说明一下,我这里用的是Test.class,这个可以替换成你想使用的任何*.class对象。

二。synchronized实现的同步功能的优缺点

1.可重入的

这个意思就是,当你持有synchronized锁,没有释放之前,你进入其他与该方法有相同锁的方法,是不需要释放当前锁并重新获取锁的。就比如递归,当前synchronized修饰的方法调用自己,是完全可以的。

2.不可中断的

当前持有锁的线程,不会被其他想要获取锁的线程打断。只有当前线程执行完释放锁,其他线程才可以获取该锁。

3.锁的持有和释放是JVM控制的,不需要自己维护。

当前线程获取锁和释放锁,开发人员不能随意用代码实现,只能代码执行中JVM根据monitor来加锁和释放锁。对synchronized没有像java的Lock接口提供提前释放锁的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值