唠唠SE的多线程-02——线程锁

2. 同步锁

什么是锁对象?

        每个java对象都有一个锁对象.而且只有一把钥匙.

如何创建锁对象:

        可以使用this关键字作为锁对象,也可以使用所在类的字节码文件对应的Class对象作为锁对象

  • 1. 类名.class
  • 2. 对象.getClass()

 

Java中的每个对象都有一个内置锁,只有当对象具有同步方法代码时,内置锁才会起作用,

    当进入一个同步的非静态方法时,就会自动获得与类的当前实例(this)相关的锁,该类的代码就是正在执行的代码。

    获得一个对象的锁也成为获取锁、锁定对象也可以称之为监视器来指我们正在获取的锁对象。

    因为一个对象只有一个锁,所有如果一个线程获得了这个锁,其他线程就不能获得了,直到这个线程释放(或者返回)锁。

    也就是说在锁释放之前,任何其他线程都不能进入同步代码(不可以进入该对象的任何同步方法)。

    释放锁指的是持有该锁的线程退出同步方法,此时,其他线程可以进入该对象上的同步方法。

 

1:只能同步方法(代码块),不能同步变量或者类

2:每个对象只有一个锁

3:不必同步类中的所有方法,类可以同时具有同步方法和非同步方法

4:如果两个线程要执行一个类中的一个同步方法,并且他们使用的是了类的同一个实例(对象)来调用方法,

        那么一次只有一个线程能够执行该方法,另一个线程需要等待,直到第一个线程完成方法调用。

        总结就是:一个线程获得了对象的锁,其他线程不可以进入该对象的同步方法。

5:如果类同时具有同步方法和非同步方法,那么多个线程仍然可以访问该类的非同步方法。

同步会影响性能(甚至死锁),优先考虑同步代码块。

6:如果线程进入sleep() 睡眠状态,该线程会继续持有锁,不会释放。

 

解决线程安全的方式1:同步代码块

 

解决线程安全的方式2:同步方法

 

加同步锁之后安全了,但是效率低了

转载于:https://my.oschina.net/LinkedBear/blog/1616057

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值