package net.zjfly.javapractise;public class TT implements Runnable {
int b = 100;
public synchronized void m1() throws Exception{
b = 1000; //修改值
Thread.sleep(5000); //睡眠,腾出足够的时间让别人修改b
System.out.println("m1:b = " + b);
}
public synchronized void m2() throws Exception {
Thread.sleep(2500); //睡眠,确保m1能现修改值
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();
Thread.sleep(6000);
System.out.println("主方法b=:"+tt.b);
}
}
示例代码,我怎么觉得不管m2上不上锁,结果都应该一样,问题是结果却是不一样。
毕竟时锁的不同的方法,最后的值应该是m2修改后的,可是给m2加上锁后似乎m2没有其作用。
解决方案 »
- 着急!!!javax.el.PropertyNotFoundException: Property 'EmployeeID' not found on type
- java日期格式问题
- 刚刚开始自学Java连接SQL Server,遇到比较白的问题。请大家帮忙
- 类名后加Handle是什么意思?
- 如何设系统环境变量和用户环境变量
- 怎样判断一个char是中文字符还是asc码字符?
- 要研究Java的API,有什么好书吗?
- 使用Icepdf读取PDF中文乱码
- 我想学习JAVA,可是我以前只学过一点点的VB跟C++,请高手指点一下
- 求救!!java语法的小问题!!
- java编程思想中TestStram求解释
- 安装完JDK,需要设置哪些东西,才能开始运行第一个JAVA程序啊
LZ只不过是不清楚线程的执行不是按顺序的,而是随机的,谁抢到CPU谁就执行
public static void main(String[] args) throws Exception {
TT tt = new TT();
Thread t = new Thread(tt);
t.start(); //这里线程t虽然start了,但是不表示一定会立即执行,因为CPU是随机分配的
//所以线程t不一定能分配到CPU,如果分配不到CPU,就会不立刻执行
tt.m2(); //所以,如果这个时候主线程还是占用着CPU就会先执行m2,
//那么最后的结果因为被m1修改了,所以感觉好像m2没效果
Thread.sleep(6000);
System.out.println("主方法b=:"+tt.b);
}
就像tt.run();只是个普通的方法调用!
虽然语句t.start()在tt.m2()之前,但正如1楼所说,线程虽然是起了,但不一定会立即分配到CPU,故
m2先获得锁,之后线程t执行时,发现锁已被方法m2锁住,故其等待,然后m2将b设置为2000后解锁,然后
主线程睡眠,此时m1立即获得锁然后将b设置为1000,然后是睡眠,醒后输出m1:b = 1000,然后主线程
睡醒后输出后一句。
2) m2不加锁
自己分析吧
Thread.sleep(1000); //LZ在这里加上个sleep,让主线程主动让出CPU试试看就知道,
//而实际的执行中CPU是系统分配的,是随机的,
//所以t.start以后主线程的CPU被收回也是有可能的,就跟模拟主动让出CPU是一个效果
tt.m2();