sycronized 问题,同一个程序两个结果?

actor_3348 2009-07-28 12:45:19
public class TT implements Runnable {
int b = 100;

public synchronized void m1() throws Exception{

b = 1000;
System.out.println("I am m1");
Thread.sleep(2000);
System.out.println("m1 : b = " + b);
}

public synchronized void m2() throws Exception {
b = 2000;
System.out.println("I am m2");
Thread.sleep(2500);

}

public void run() {
try {
m1();
} catch(Exception e) {
e.printStackTrace();
}
}

public static void main(String[] args) throws Exception {
TT tt = new TT();
Thread t = new Thread(tt);
t.start();

tt.m2();
System.out.println("main:"+tt.b);
}
}

运行了多次次,出了两个结果。

结果1:

I am m2
I am m1
main:1000
m1 : b = 1000

结果2:

I am m2
main:2000
I am m1
m1 : b = 1000

请问是不是看谁的线程先拿到当前对象的锁啊,新手一个,希望大虾们解释下。
这个sychronized 关键字也不是理解得很透彻?谢谢
...全文
135 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
YY_MM_DD 2009-07-28
  • 打赏
  • 举报
回复
这很正常啊...时间片轮换时间本来就不规则的
你运行一百次说不定就是一百个结果
actor_3348 2009-07-28
  • 打赏
  • 举报
回复
谢谢大家 这个确实是和时间片有关,看那个线程运行的快点,
受教了。
koko2541 2009-07-28
  • 打赏
  • 举报
回复
synchronized 修饰方法:在方法中,只能让一个线程进入,不说是锁入了里面的变量.
qsrock 2009-07-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gao11810 的回复:]
搂主这个程序的主要情况是展示时间片的轮换,基本和synchronized无关,真正的synchronized使用是需要你去调用同一个参数或者方法,synchronized不能用来锁线程,也许你可以使用join()和yield()来操作。
时间片的实验你可以在2个线程类里面写打印1到100的run(),你在main()里面前后启动他们,会发现不同的打印顺序,常用的实例就是赛马程序

[/Quote]
说得很正确!
cl252593459 2009-07-28
  • 打赏
  • 举报
回复
线程有不稳定性啊,所以结果不一致,很正常啊
gao11810 2009-07-28
  • 打赏
  • 举报
回复
搂主这个程序的主要情况是展示时间片的轮换,基本和synchronized无关,真正的synchronized使用是需要你去调用同一个参数或者方法,synchronized不能用来锁线程,也许你可以使用join()和yield()来操作。
时间片的实验你可以在2个线程类里面写打印1到100的run(),你在main()里面前后启动他们,会发现不同的打印顺序,常用的实例就是赛马程序
三仙半 2009-07-28
  • 打赏
  • 举报
回复
楼主的实验挺有意思,不过这个实验似乎并不适合体会synchronized,因为你并没有两个线程都去调用同一个同步方法。
actor_3348 2009-07-28
  • 打赏
  • 举报
回复
谢谢,看了还是多实践才会发现问题。
gesanri 2009-07-28
  • 打赏
  • 举报
回复
对,谁先抢到谁先上,呵呵,结果是不一定的

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧