A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 史卜坤 中级黑马   /  2012-7-13 16:51  /  1631 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  • public class TT implements Runnable {
  • int b = 100;
  • public synchronized void m1() throws Exception{
  •   //Thread.sleep(2000);
  •   b = 1000;
  •   Thread.sleep(5000);
  •   System.out.println("b = " + b);
  • }
  • public synchronized 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) throws Exception {
  •   TT tt = new TT();
  •   Thread t = new Thread(tt);
  •   t.start();
  •   tt.m2();
  •   System.out.println(tt.b);
  • }
  • }

复制代码
为什么是m2()执行先而不是m1()执行先呢?如果m2()去掉synchronized又是怎么样了?

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

5 个回复

倒序浏览
程序都是从主程序void main开始进行的啊,由于有synchronized 保证下,从主程序
public static void main(String[] args) throws Exception {
  TT tt = new TT();
  Thread t = new Thread(tt);
  t.start();

  tt.m2();
开始先执行,

如果m2去掉了synchronized,
而synchronized保证在同一时刻最多只有一个线程执行该段代码。这个还是自己可以百度查看到的啊。
去掉了不久出问题了吗,不能保证就是只有
void m2() throws Exception 里面线程在运行。
我是这么理解的
回复 使用道具 举报
本帖最后由 黑马振鹏 于 2012-7-13 18:30 编辑

t.start();--->m1()
  tt.m2();--->m2()
因为m1()中有Thread.sleep(5000);暂停5秒。
m2()Thread.sleep(2500);暂停2.5秒。
流程是执行到m1,然后暂停五秒,开始执行m2这样得到的值就是2000.
再过2.5秒回到同步函数m1() 打印b=1000;
因为sleep而产生cpu执行权的变化

你可以试试吧sleep对应的参数修改一下再观察结果。

点评

这个和sleep的时间没关系的吧,个人认为加了synchronized关键字以后,此举只是方便测试用的  发表于 2012-7-13 17:37
回复 使用道具 举报
陈淑飞 来自手机 中级黑马 2012-7-13 17:27:56
板凳
sleep时沒有释放this锁呢。m2执行先后,才会执着m1。主线start一个线程时,jvm处理底层代码需求时间的。而同时主线程还在走呢。所有先是m2.
来自:黑马程序员训练营论坛 Android客户端来自: Android客户端
回复 使用道具 举报
主线程开启另外一个线程时,它自己还在走,所以先执行的m2,由于m2和m1都加了同一个锁,要等m2执行完,m1才能执行。

去掉同步的话,执行结果是根据哪个线程先拿到cup执行,执行结果不一样
回复 使用道具 举报
  t.start();

  tt.m2();

t.start();   方法一执行,就多了一个线程,此时main主线程还在往下执行,此时的   tt.m2();比线程里面的Run()方法先抢到cpu资源,所以先执行m2(),
但是这个不是唯一的,说不定就先执行m1()了,由于都加了同步,m2执行的时候m1挂起了,所以只能等m2执行完了才能m1

去掉同步那就看谁先抢到cpu,先抢到先执行
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马