先来看内置类和静态内置类的使用
package com.myObject;
public class PublicClass {
String p="PublicClass";
public String getP() {
return p;
}
public void setP(String p) {
this.p = p;
}
public class PrivateClass1 {
String p1="PrivateClass1";
public String getP1() {
return p1;
}
public void setP1(String p1) {
this.p1 = p1;
}
}
public static class PrivateClass2 {
String p2="PrivateClass1";
public String getP2() {
return p2;
}
public void setP2(String p2) {
this.p2 = p2;
}
}
}
package com.test;
import com.myObject.PublicClass;
import com.myObject.PublicClass.PrivateClass1;
import com.myObject.PublicClass.PrivateClass2;
public class ClassTest {
public static void main(String[] args) {
PublicClass p = new PublicClass();
PrivateClass1 p1 = p.new PrivateClass1();
PrivateClass2 p2 = new PrivateClass2();
System.out.println(p.getP());
System.out.println(p1.getP1());
System.out.println(p2.getP2());
}
}
内置类和静态内置类作为对象锁,跟普通类的用法一样
package com.myObject;
public class PublicClass2 {
public static class PrivateClass1 {
public void p1m1(PrivateClass2 class2){
try {
synchronized(class2){
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 p1m2(){
try {
synchronized(this){
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 static class PrivateClass2 {
synchronized public void p2m1(){
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();
}
}
}
}
package com.myThread;
import com.myObject.PublicClass2.PrivateClass1;
import com.myObject.PublicClass2.PrivateClass2;
public class Thread1a extends Thread {
PrivateClass1 class1;
PrivateClass2 class2;
public Thread1a(PrivateClass1 class1,PrivateClass2 class2) {
this.class1 = class1;
this.class2 = class2;
}
@Override
public void run() {
super.run();
class1.p1m1(class2);;
}
}
package com.myThread;
import com.myObject.PublicClass2.PrivateClass1;
public class Thread1b extends Thread {
PrivateClass1 class1;
public Thread1b(PrivateClass1 class1) {
this.class1 = class1;
}
@Override
public void run() {
super.run();
class1.p1m2();;
}
}
package com.myThread;
import com.myObject.PublicClass2.PrivateClass2;
public class Thread1c extends Thread {
PrivateClass2 class2;
public Thread1c(PrivateClass2 class2) {
this.class2 = class2;
}
@Override
public void run() {
super.run();
class2.p2m1();
}
}
package com.test;
import com.myObject.PublicClass2.PrivateClass1;
import com.myObject.PublicClass2.PrivateClass2;
import com.myThread.Thread1a;
import com.myThread.Thread1b;
import com.myThread.Thread1c;
public class Test1 {
public static void main(String[] args) throws InterruptedException {
PrivateClass1 class1 = new PrivateClass1();
PrivateClass2 class2 = new PrivateClass2();
Thread1a thread1a = new Thread1a(class1,class2);
thread1a.setName("a");
thread1a.start();
Thread1b thread1b = new Thread1b(class1);
thread1b.setName("b");
thread1b.start();
Thread1c thread1c = new Thread1c(class2);
thread1c.setName("c");
thread1c.start();
}
}
打印结果
1452765098349 a begin
1452765098351 b begin
1452765101350 a end
1452765101350 c begin
1452765101351 b end
1452765104350 c end
b和a(c)异步,a和c同步