synchronized代码块括号中写什么?

1、synchronized锁住的是括号里的对象,而不是代码
2、当synchronized锁住一个对象后,别的线程如果也想拿到这个对象的锁,就必须等待这个线程执行完成释放锁,才能再次给对象加锁,这样才达到线程同步的目的
3、可以锁什么?
3.1、this:也就是当前对象,由于多线程下,创建的某各类的对象在堆中不是同一个,所以锁失效
3.2、类名.class:也就是某一类对象,例如Person类,那么当Person类被锁,只要是该类创建的所有对象,就都是互斥的
4、使用代码讲解这两种方式的区别

```
package com.xc.test.synchron;

public class Settle {

public static void main(String[] args) {
    Thread thread1 = new Thread(() -> {
        Settle settle = new Settle();
        settle.method();
    });
    Thread thread2 = new Thread(() -> {
        Settle settle = new Settle();
        settle.method();
    });
    thread1.start();
    thread2.start();
}

public void method(){
    System.out.println("锁定前的代码" + Thread.currentThread());
    synchronized (this) {
        System.out.println("第一个线程进来之后,需要等待执行完毕,后续的线程才能进来" + Thread.currentThread());
        try {
            Thread.sleep(90000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    System.out.println("锁定后的代码" + Thread.currentThread());
}
}
```
输出结果
```
锁定前的代码Thread[Thread-0,5,main]
锁定前的代码Thread[Thread-1,5,main]
第一个线程进来之后,需要等待执行完毕,后续的线程才能进来Thread[Thread-0,5,main]
第一个线程进来之后,需要等待执行完毕,后续的线程才能进来Thread[Thread-1,5,main]
```
```
package com.xc.test.synchron;

public class Settle {

public static void main(String[] args) {
    Thread thread1 = new Thread(() -> {
        Settle settle = new Settle();
        settle.method();
    });
    Thread thread2 = new Thread(() -> {
        Settle settle = new Settle();
        settle.method();
    });
    thread1.start();
    thread2.start();
}

public void method(){
    System.out.println("锁定前的代码" + Thread.currentThread());
    synchronized (Settle.class) {
        System.out.println("第一个线程进来之后,需要等待执行完毕,后续的线程才能进来" + Thread.currentThread());
        try {
            Thread.sleep(90000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    System.out.println("锁定后的代码" + Thread.currentThread());
}
}
```
```
锁定前的代码Thread[Thread-0,5,main]
锁定前的代码Thread[Thread-1,5,main]
第一个线程进来之后,需要等待执行完毕,后续的线程才能进来Thread[Thread-0,5,main]
```

5、总结
从控制台打印出来的结果可以看出,分别锁住this和类的class对象,结果存在天差地别,前者没有锁住,后者才锁住了

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值