- 什么是锁对象?
每个java对象都有一个锁对象.而且只有一把钥匙. - 如何创建锁对象:
可以使用this关键字作为锁对象,也可以使用所在类的字节码文件对应的Class对象作为锁对象类名.class
-
对象.getClass()
- Java中的每个对象都有一个内置锁,只有当对象具有同步方法代码时,内置锁才会起作用,当进入一个同步的非静态方法时,就会自动获得与类的当前实例(this)相关的锁,该类的代码就是正在执行的代码。获得一个对象的锁也成为获取锁、锁定对象也可以称之为监视器来指我们正在获取的锁对象。
- 因为一个对象只有一个锁,所有如果一个线程获得了这个锁,其他线程就不能获得了,直到这个线程释放(或者返回)锁。也就是说在锁释放之前,任何其他线程都不能进入同步代码(不可以进入该对象的任何同步方法)。释放锁指的是持有该锁的线程退出同步方法,此时,其他线程可以进入该对象上的同步方法。
- 注意
- 只能同步方法(代码块),不能同步变量或者类
- 每个对象只有一个锁
- 不必同步类中的所有方法,类可以同时具有同步方法和非同步方法
- 如果两个线程要执行一个类中的一个同步方法,并且他们使用的是了类的同一个实例(对象)来调用方法,那么一次只有一个线程能够执行该方法,另一个线程需要等待,直到第一个线程完成方法调用,总结就是:一个线程获得了对象的锁,其他线程不可以进入该对象的同步方法。
- 如果类同时具有同步方法和非同步方法,那么多个线程仍然可以访问该类的非同步方法。
- 同步会影响性能(甚至死锁),优先考虑同步代码块。
- 如果线程进入sleep() 睡眠状态,该线程会继续持有锁,不会释放。
-
同步函数
- 使用synchronized修饰该函数则称作为同步函数。
- 同步函数要注意的事项:
- 非静态同步函数的锁对象是this对象,静态函数的锁对象是当前所属类的class文件对象。
- 同步函数的锁对象是固定的,无法更改。
- 推荐使用: 同步代码块
- 推荐的原因
- 同步代码块的锁对象可以由我们自己指定,同步函数的锁对象是固定 的。
- 同步代码块可以随意指定哪个范围需要被同步,而同步函数必须是整个函数都同步, 代码不灵活。
线程 3. 锁对象
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...