静态synchronized同步方法和synchronized(class)代码块
synchronized关键字加到static静态方法就是给Class类上锁,而synchronized(class)同步代码块的作用也是一样的。
package com.myObject;
public class Object1 {
synchronized public void print() {
try {
System.out.println(System.currentTimeMillis() + " "+ Thread.currentThread().getName() + ":begin");
Thread.sleep(3000);
System.out.println(System.currentTimeMillis() + " "+ Thread.currentThread().getName() + ":end");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized static public void print2() {
try {
System.out.println(System.currentTimeMillis() + " "+ Thread.currentThread().getName() + ":begin");
Thread.sleep(3000);
System.out.println(System.currentTimeMillis() + " "+ Thread.currentThread().getName() + ":end");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void print3() {
try {
synchronized(Object1.class){
System.out.println(System.currentTimeMillis() + " "+ Thread.currentThread().getName() + ":begin");
Thread.sleep(3000);
System.out.println(System.currentTimeMillis() + " "+ Thread.currentThread().getName() + ":end");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
package com.myThread;
import com.myObject.Object1;
public class Thread1a extends Thread {
Object1 object1;
public Thread1a(Object1 object1) {
this.object1 = object1;
}
@Override
public void run() {
super.run();
object1.print();
}
}
package com.myThread;
import com.myObject.Object1;
public class Thread1b extends Thread {
Object1 object1;
public Thread1b(Object1 object1) {
this.object1 = object1;
}
@Override
public void run() {
super.run();
object1.print2();
}
}
package com.myThread;
import com.myObject.Object1;
public class Thread1c extends Thread {
Object1 object1;
public Thread1c(Object1 object1) {
this.object1 = object1;
}
@Override
public void run() {
super.run();
object1.print3();
}
}
package com.test;
import com.myObject.Object1;
import com.myThread.Thread1a;
import com.myThread.Thread1b;
import com.myThread.Thread1c;
public class Test1 {
public static void main(String[] args) throws InterruptedException {
Object1 object1 = new Object1();
Thread1a thread1a = new Thread1a(object1);
thread1a.setName("a");
thread1a.start();
Thread1b thread1b = new Thread1b(object1);
thread1b.setName("b");
thread1b.start();
Thread1c thread1c = new Thread1c(object1);
thread1c.setName("c");
thread1c.start();
}
}
打印结果
1452755386081 c:begin
1452755386081 a:begin
1452755389082 a:end
1452755389082 c:end
1452755389082 b:begin
1452755392082 b:end
分析:
1)a和b(或者c)对比是异步的,说明this锁和Class锁是不同的锁
2)b和c对比是同步的,说明静态synchronized同步方法和synchronized(class)代码块都是Class锁
this锁和Class锁的作用范围
this锁:同一对象同一实例
Class锁:同一对象的所有实例
将上面例子的测试方法改为
package com.test;
import com.myObject.Object1;
import com.myThread.Thread1a;
import com.myThread.Thread1b;
import com.myThread.Thread1c;
public class Test1 {
public static void main(String[] args) throws InterruptedException {
Object1 object1 = new Object1();
Object1 object2 = new Object1();
// Thread1a thread1a = new Thread1a(object1);
// thread1a.setName("a");
// thread1a.start();
Thread1b thread1b = new Thread1b(object1);
thread1b.setName("b");
thread1b.start();
Thread1c thread1c = new Thread1c(object2);
thread1c.setName("c");
thread1c.start();
}
}
打印结果
1452756237100 b:begin
1452756240100 b:end
1452756240100 c:begin
1452756243100 c:end