请哪位高手能够帮忙讲解如下 java代码运行的过程?
有时候是 2000 b=1000;
有时候是 1000 b=1000(多数);
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);
}
}
java 多线程 同步 锁 问题
答案:3 悬赏:20 手机版
解决时间 2021-04-08 19:09
- 提问者网友:暮烟疏雨之际
- 2021-04-08 09:15
最佳答案
- 五星知识达人网友:上分大魔王
- 2021-04-08 10:40
很简单,t.start() 后,Java自动开始执行线程的run()方法, 但是这个执行时间是不确定的,而且java不会等到 run()执行完成后再往下走,而是尝试去调用tt.m2()了。
如果run() 比 tt.m2()先执行,就是1000, 然后tt.m2()执行,结果是2000
反之结果是1000
总之线程的调度时间是无法确定的,因为Java并不是一个实时系统。
如果run() 比 tt.m2()先执行,就是1000, 然后tt.m2()执行,结果是2000
反之结果是1000
总之线程的调度时间是无法确定的,因为Java并不是一个实时系统。
全部回答
- 1楼网友:山君与见山
- 2021-04-08 12:25
在主线程中起了一个t线程,,t跟主线程是并发的,这两个线程都调用了共享资源tt的方法,只是不知道调用的先后,加入吗m1后调用则结果为1000
- 2楼网友:傲气稳了全场
- 2021-04-08 11:26
噢,是这样的,不是什么东西都能当做锁,你不能这样理解。 synchronized(obj),obj这里是你所在类的midlet的一个实例对象。 目的是解决因线程不同步而对数据造成破坏的问题。 假如:在一个类中有一个成员变量a,还有两个线程,如果线程不同步的话,这两个线程有可能同时访问同一个变量a,这样的话,就会出现问题,最后执的结果a到底是几呢,所以就要使用线程同步这个办法了。 使用线程同步后,线程1在访问a的时候,我加了一把锁,在这个时候别的线程是不允许访问a的,等线程1对a有访问结束后,就会去掉这把锁,其他的线程再访问a的时候,又会加锁,这样在同一时候,只能有一方访问a,这样就不会出现问题,我说这么多,你明白了吗?希望你能明白,不然我说的算白说了,呵呵!!!!
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯