今天再次加深了对线程互斥的理解,整理代码,方便以后查看。
public class ThreadSynchronized {
public static void main(String[] args) {
//静态方法不能调用内部类,静态方法是不用创建对象就可以访问的,
//所以在使用静态方法的时候,可能获取不到内部类的信息,导致不能创建内部类对象
//可将该类设置为static解决
Tree t = new Tree();
new Thread(new Runnable() {
@Override
public void run() {
while(true){
t.show();
// t.show2();
}
}
}).start();
new Thread(){
public void run() {
while(true){
// t.show();
// t.show2();
t.show3();
}
};
}.start();
}
static class Tree {
String flag = "";
public void show(){
//第一种形式,修饰代码块
synchronized(flag){
for(int i = 0; i < 10; i++){
System.out.print(i+"-");
}
System.out.println();
}
}
//第二种形式,修饰方法,这种默认是以this为 “锁” 的
// 一个线程调用show,一个线程调用show2,是不会互斥的,毕竟锁是不同的
// 要想两个实现互斥,可以将第一种形式的flag,换为this
public synchronized void show2(){
for(int i = 0; i < 10; i++){
System.out.print(i+"-");
}
System.out.println();
}
// 注意这个 静态的synchronized,不是以当前对象的this为 “锁”, 而是以当前 类 为锁。
// 一个线程调用show,一个线程盗用show3,也是不会互斥的
// 可以将第一种的flag,换为 类名.class 起到互斥的效果。
public static synchronized void show3(){
for(int i = 0; i < 10; i++){
System.out.print(i+"-");
}
System.out.println();
}
}
}