黑马程序员技术交流社区
标题: 线程之同步 [打印本页]
作者: outsider1020 时间: 2014-12-23 10:55
标题: 线程之同步
public class TT implements Runnable {
int b =100;
public synchronized void m1() throws Exception
b=1000 ;
Thread .sleep( 5000);
System .out. println("b=" +b);
}
public void m2() throws Exception {
Thread .sleep( 2500);
b=2000 ;
}
public void run() {
try {
m1();
} catch (Exception e) {
e .printStackTrace() ;
}
}
public static void main(String [] args ) {
TT tt=new TT ();
Thread t=new Thread (tt);
t .start() ;
try {
Thread .sleep( 1000);
} catch (InterruptedException e) {
e .printStackTrace() ;
}
try {
tt .m2();
} catch (Exception e) {
e .printStackTrace() ;
}
}
}
执行结果为:
作者: 些许 时间: 2014-12-23 10:55
程序从main函数进去, |——开辟了一个t线程 ,t执行中b=1000再停留了5000毫秒
|——main线程继续向下执行停留了1000毫秒在调用了tt .m2()在停留2500毫秒后b=2000毫秒
所以当t线程停留在3500毫秒时 ,mian线程走完了了并改动了b=2000,所以t线程在停留1500毫秒 打印出来的是改动后的b
作者: alston 时间: 2014-12-24 07:52
进来学习了
作者: 小徐_y8nUx 时间: 2014-12-24 08:38
最好写的程序能有格式,不然看起来费劲
作者: 中国梦 时间: 2014-12-24 08:59
进来学习学习
作者: outsider1020 时间: 2014-12-26 09:46
受教。。。
作者: outsider1020 时间: 2014-12-26 10:00
感谢。。。。。。。。。。。
作者: Mr.JUN 时间: 2015-1-6 11:38
为什么不是1000,怎样修改才可以变为1000,LZ有了答案,发来看看哦
作者: jant60 时间: 2015-1-7 15:10
因为没有循环,他只执行一次,当执行m1()给b赋值后,他就睡着了
在还没醒过来时候(大概2500ms后)m2被主线程执行了,给b赋值2000,然后m1醒了,就输出了2000
在这里不回出现锁的情况因为他们用的不是一个锁
作者: 自信流云 时间: 2015-1-9 21:05
新人来学习
作者: shaoboguanzi 时间: 2015-1-23 17:48
线程同步是解决线程相互竞争一个资源发生的竞争。
作者: cuixinfu 时间: 2015-1-27 10:56
路过看看 学习学习!
作者: yanqiuqiu 时间: 2015-1-28 09:06
多学习。。
作者: 付家辉 时间: 2015-3-13 18:00
先执行m1,再执行m2,对b的值进行了覆盖。假如你先执行m2,再执行m1,结果为就为1000
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |