当前位置: 代码迷 >> Eclipse >> Java 线程同步有关问题
  详细解决方案

Java 线程同步有关问题

热度:24   发布时间:2016-04-23 14:04:18.0
Java 线程同步问题
public class thread10 {
public static void main(String[] args){
computer t = new computer('a');
computer t1 = new computer('b');
computer t2 = new computer('c');
t.start();
t1.start();
t2.start();
}
}
class computer extends Thread{
char ch;
static Object obj = new Object();
computer(char ch){
this.ch = ch;
}
public void print(char ch){
for(int i = 0; i < 10; i++){
System.out.print(ch);
}
}
public void run(){
synchronized(obj){
for(int i = 0; i < 10; i++){
print(ch);
System.out.println();
}
}
System.out.println("同步结束");
}
}

运行结果
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
aaaaaaaaaa
同步结束
bbbbbbbbbb
bbbbbbbbbb
bbbbbbbbbb
bbbbbbbbbb
bbbbbbbbbb
bbbbbbbbbb
bbbbbbbbbb
bbbbbbbbbb
bbbbbbbbbb
bbbbbbbbbb
cccc同步结束
cccccc
cccccccccc
cccccccccc
cccccccccc
cccccccccc
cccccccccc
cccccccccc
cccccccccc
cccccccccc
cccccccccc
同步结束

当c获得线程之后,不是锁定线程c了么,为什么还要被输出“同步结束”的语句打断

------解决方案--------------------
你并没有把“同步结束”的打印语句放到synchronized同步块里面
synchronized(obj){
for(int i = 0; i < 10; i++){
print(ch);
System.out.println();
}
------解决方案--------------------
不是哟
你没有把“System.out.println("同步结束");”放到synchronized中,那么一个线程执行到synchronized(obj){
for(int i = 0; i < 10; i++){
print(ch);
System.out.println();
}
}
这里就可以启动下一个排队获取锁的线程。

由于System.out.println()输入到控制台方法你不知道虚拟机是怎么调用的,所以你也不能确定输出到控制台的顺序,所以我们只能判断到 把synchronized这个语句块中的语句执行完了,就释放锁,然后下个线程获得锁,就可能出现两个线程同时运行的情况(跟本地机器相关)。
应该明白了吧,再说都罗嗦了
  相关解决方案