您的位置:首页 > 其它

多线程互斥synchronized

2018-01-15 20:44 239 查看
今天再次加深了对线程互斥的理解,整理代码,方便以后查看。

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();
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: