关于JAVA的synchronized

roov_csdn 2016-05-02 01:29:59
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 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);
}
}


最后输出:
1000
b = 1000

也就是说m2() 先于m1()完成。
m2,m1都有synchronized,m1自己创建了新线程,m2用的是main里的线程
m1的线程和main的线程交替进行,当执行m1后,m1锁住,线程sleep 5s
切换进程2,此时可以执行m2?
...全文
148 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaovhao 2016-05-03
  • 打赏
  • 举报
回复
sleep是不会释放锁的
OakVips 2016-05-03
  • 打赏
  • 举报
回复
m1、m2哪个先执行,看cup心情。和休眠时间还有点关系,相差太大,小的被先执行的几率大一点。
tangxheng 2016-05-03
  • 打赏
  • 举报
回复
你这代码和synchronized无关,synchronized 加在方法前,是指不能同时执行此方法。不同方法不相关的吧。 这个是我理解错了
tangxheng 2016-05-03
  • 打赏
  • 举报
回复
你这代码和synchronized无关,synchronized 加在方法前,是指不能同时执行此方法。不同方法不相关的吧。
tangxheng 2016-05-03
  • 打赏
  • 举报
回复
主线程中启动的子线程何时启动不是固定的。 再说了,启动子线程需要时间,主线程的m2是紧跟着执行,所以m2有更大机率先执行到。
bajinggong 2016-05-02
  • 打赏
  • 举报
回复
启动的线程会不会立即被执行,这个不是你能决定的。

62,628

社区成员

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

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