synchronized 锁重入
关键字synchronized锁重入的功能,也就是在使用synchronized 时,当一个线程得到了一个对象的锁后,再次请求此对象时是可以再次得到该对象的锁 示例代码如下
public class SyncDubbo1 {
public synchronized void method1(){
System.out.println("method1");
method2();
}
public synchronized void method2(){
System.out.println("method2");
method3();
}
public synchronized void method3(){
System.out.println("method3");
}
public static void main(String[] args) {
final SyncDubbo1 sDubbo1 = new SyncDubbo1();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
sDubbo1.method1();
}
});
t1.start();
}
}
父子类继承关系时
public class SyncDubbo2 {
static class Main{
public int i = 10;
public synchronized void operatorSup(){
try {
i--;
System.out.println("Main print i = "+i);
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
static class Sub extends Main{
public synchronized void operatorSub(){
try {
while (i>0) {
i--;
System.out.println("Sub print i = "+i);
Thread.sleep(100);
this.operatorSup();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
Sub sub = new Sub();
sub.operatorSub();
}
});
t1.start();
}
}
对象锁 使用示例
public class ObjectLock {
public void method1(){
synchronized (this) { //对象锁
try {
System.out.println("do method1..");
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void method2(){ //类锁
synchronized (ObjectLock.class) {
try {
System.out.println("do method2..");
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private Object lock = new Object();
public void method3(){ //任何对象锁
synchronized (lock) {
try {
System.out.println("do method3..");
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
final ObjectLock objLock = new ObjectLock();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
objLock.method1();
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
objLock.method2();
}
});
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
objLock.method3();
}
});
t1.start();
t2.start();
t3.start();
}
}
尽量避免使用 字符串对象 做为锁对象