Java 多线程学习笔记(五)synchronized 锁重入

来源:互联网 发布:马赛克视频还原软件 编辑:程序博客网 时间:2024/06/11 01:41

关键字synchronized 拥有锁重入的功能,也就是使用synchronized时,当一个线程得到一个对象锁后,再次请求此对象锁时是可以再次得到该对象的锁的。这也就证明在一个synchronized方法/快的内部调用本类的其他的synchronized方法/快时,是永远可以得到锁的。


package extthread;import myservice.Service;public class MyThread extends Thread {@Overridepublic void run() {Service service = new Service();service.service1();}}

package myservice;public class Service {synchronized public void service1() {System.out.println("service1");service2();}synchronized public void service2() {System.out.println("service2");service3();}synchronized public void service3() {System.out.println("service3");}}
package test;import extthread.MyThread;public class Run {public static void main(String[] args) {MyThread t = new MyThread();t.start();}}
可重入锁也支持在父子类继承的环境中。
package extthread;import myservice.Main;import myservice.Sub;public class MyThread extends Thread {@Overridepublic void run() {Sub sub = new Sub();sub.operateISubMethod();}}

package myservice;public class Main {public int i = 10;synchronized public void operateIMainMethod() {try {i--;System.out.println("main print i=" + i);Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

package myservice;public class Sub extends Main {synchronized public void operateISubMethod() {try {while (i > 0) {i--;System.out.println("sub print i=" + i);Thread.sleep(100);this.operateIMainMethod();}} catch (InterruptedException e) {e.printStackTrace();}}}
package test;import extthread.MyThread;public class Run {public static void main(String[] args) {MyThread t = new MyThread();t.start();}}

此实验说明,当存在父子关系时,子类完全可以通过可重入锁调用父类的同步方法。

2 0
原创粉丝点击