永发信息网

java 多线程 同步 锁 问题

答案:3  悬赏:20  手机版
解决时间 2021-04-08 19:09
请哪位高手能够帮忙讲解如下 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);
}
}
最佳答案
很简单,t.start() 后,Java自动开始执行线程的run()方法, 但是这个执行时间是不确定的,而且java不会等到 run()执行完成后再往下走,而是尝试去调用tt.m2()了。
如果run() 比 tt.m2()先执行,就是1000, 然后tt.m2()执行,结果是2000
反之结果是1000

总之线程的调度时间是无法确定的,因为Java并不是一个实时系统。
全部回答
在主线程中起了一个t线程,,t跟主线程是并发的,这两个线程都调用了共享资源tt的方法,只是不知道调用的先后,加入吗m1后调用则结果为1000
噢,是这样的,不是什么东西都能当做锁,你不能这样理解。 synchronized(obj),obj这里是你所在类的midlet的一个实例对象。 目的是解决因线程不同步而对数据造成破坏的问题。 假如:在一个类中有一个成员变量a,还有两个线程,如果线程不同步的话,这两个线程有可能同时访问同一个变量a,这样的话,就会出现问题,最后执的结果a到底是几呢,所以就要使用线程同步这个办法了。 使用线程同步后,线程1在访问a的时候,我加了一把锁,在这个时候别的线程是不允许访问a的,等线程1对a有访问结束后,就会去掉这把锁,其他的线程再访问a的时候,又会加锁,这样在同一时候,只能有一方访问a,这样就不会出现问题,我说这么多,你明白了吗?希望你能明白,不然我说的算白说了,呵呵!!!!
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
心里有想着对神灵不敬,画面,或想法,会受惩
龙静食杂店在哪里啊,我有事要去这个地方
跟男朋友一起住宾馆,感觉男朋友已近没有想碰
苹果iPad mini2 扬声器是单还是双
在中医字里荥字怎么读,荥,怎么读 30分
单选题下列对中国政府提出和平共处五项原则的
层高24的房子14楼好还是17楼好?
林文信和宋大叔是基督徒啊 ?找知道的人确认
上海东海职业技术学院有哪些好一点的专业?
三苏指什么,李杜指什么三苏指什么文房四宝是
股民李明上星期六买进春兰公司股票1000股,每
我是87年的兔子,天蝎座,火命,刚照完写真,
深圳双免是什么意思,工行双免卡是免什么呀?
我是学建筑工程技术专业的,但是我想做造价方
猜信封24个数字技巧
推荐资讯
我在黄埔大道中与华南快速交汇处(华侨医院、
单选题4本不同的书,全部分给3个学生,每个学
当初何必太认真,他们说人生一场梦又何必太认
iPhone6换屏后一天内突然黑屏三次,插上充电
摩托车后刹车片烂了怎么办
长虹世纪荣廷48栋预售证
单选题下列各组词语中,没有错别字的一组是A.
谁能预知未来?
电脑刷新慢怎么回事,电脑老是自动刷新怎么回
媳妇最近迷上 王者 什么都不做成天到晚的打游
正合胶带厂在哪里啊,我有事要去这个地方
形容马云的句子
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?