为什么结果是100和a=1000,而不是1000和a=1000?请高手帮忙解决,谢谢public class TestDeadLockSuper implements Runnable{
int a=0;
Test1 t=new Test1();
public static void main(String[] args) {
TestDeadLockSuper td1=new TestDeadLockSuper();
TestDeadLockSuper td2=new TestDeadLockSuper();
td1.a=0;
td2.a=1;
Thread t1= new Thread(td1);
Thread t2=new Thread(td2);
t1.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t2.start();
}
public void run(){
if(a==0){
t.setB();
}else{
t.printB();
}
}
}
class Test1{
public int b=100;
public synchronized void setB(){
b=1000;
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("b="+b);
}
public void printB(){
System.out.println(b);
}
}
int a=0;
Test1 t=new Test1();
public static void main(String[] args) {
TestDeadLockSuper td1=new TestDeadLockSuper();
TestDeadLockSuper td2=new TestDeadLockSuper();
td1.a=0;
td2.a=1;
Thread t1= new Thread(td1);
Thread t2=new Thread(td2);
t1.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t2.start();
}
public void run(){
if(a==0){
t.setB();
}else{
t.printB();
}
}
}
class Test1{
public int b=100;
public synchronized void setB(){
b=1000;
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("b="+b);
}
public void printB(){
System.out.println(b);
}
}
解决方案 »
- xsl相关问题,请教高手
- action 里面 每格2秒 ac.put 页面不刷新如何在 <s:textare/ >获取动态数据
- 关于页面加载onload时调用action导致死循环!!!!!!
- 急求一个C/S模式开发的例子
- 有关中央授权认证CAS3的问题
- struts2在JSP页面怎样上传2张图片,是保存到2个字段里面
- Struts标签<html:form>与JavaScript客户端验证问题
- 在struts里,如何用logic标签来比较两个变量?
- 请问:我的jbuilderx Struts1.1工程不能进行Tiles布局,why?
- 如何在applet中使用rmi?
- 我是名大二学生,请大家给我指条路哈
- 下面这两个for语句那个执行的更快?
本程序启动后一共会有三个线程,主线程main,子线程t1,t2
首先主线程运行到t1.start();
说明t1线程处于就绪状态,然后执行到Thread.sleep(1000);
主线程会进行1000ms睡眠状态,t1线程开始运行,执行setB方法
执行到Thread.sleep(5000);线程t1会进入5000ms的睡眠状态,比主线程睡眠时间长,所以之后
运行主线程,main继续,会启动t2线程,主线程结束,但t1的睡眠时间还没到,故会执行printB方法
输入100,t2线程结束,t1线程继续,输入b=1000
其中setB方法虽然睡眠,但已经执行b=1000,为什么printB时还是100呢,
每个线程都可以看成单独运行的程序,有属于自己的临时缓冲区,你执行b =1000,但锁没有释放,
所以变量的值并不会被写到同步线程的公共缓冲区中,t2线程自然得不到你更新的值
楼上别把问题搞复杂了