一个关于线程同步的问题

new_class 2008-04-20 08:35:46
JAVA CODE:
public class TestLock1 implements Runnable {
int b=100;
public synchronized void m1() throws Exception {
b=1000;
Thread.sleep(5000);
System.out.println("b="+b);
}

public void m2(){
System.out.println(b);
}

public void run(){
try{
m1();
} catch(Exception e){
e.printStackTrace();
}
}

public static void main(String[] args) throws Exception{
TestLock1 tl = new TestLock1();
Thread t = new Thread(tl);
t.start();

Thread.sleep(1000);
tl.m2();
}
}

输出结果:1000
b=1000

我觉得流程是这样的:首先主线程睡眠,线程t1起来,执行到b=1000;时,线程t1开始睡眠,主线程开始执行m2()方法,但我不明白m2()方法体内部是怎么访问到b=1000的,m1()不是已经被锁住了吗?
...全文
80 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
new_class 2008-04-20
  • 打赏
  • 举报
回复
明白了 谢谢高手了
J_Factory 2008-04-20
  • 打赏
  • 举报
回复
方法里只能有变量吧,还能内嵌方法?没用过

同步的方法之间是存在着竞争,而非同步的方法和同步方法之间没有竞争,所以在同步的方法中用到了相同的变量这时这些变量可以看成同步的,但在非同步和同步的方法中相同的变量不存在同步。

拿你的程序来说,m1是个同步的方法,它里面用到了b变量,m2是个非同步的方法,它也用到了b,这两个方法可以在同一时间对b进行操作的。相反要是m2也是一个同步的方法,那不会出现m1,m2在同一时间被调用,也就不会出现b被同时操作的可能
new_class 2008-04-20
  • 打赏
  • 举报
回复
里面的“东西”是指某些变量吗?那里面的一些方法外部能引用吗?
J_Factory 2008-04-20
  • 打赏
  • 举报
回复
方法只是拿到锁就能执行,否则等待,里面的东西关不了,是所有方法公用的,你可以向下如果方法里的东西也是同步的,那有肯能会出现死锁
new_class 2008-04-20
  • 打赏
  • 举报
回复
对方法的同步,里面的东西不同步?里面的“东西”不是方法的一部分么?
J_Factory 2008-04-20
  • 打赏
  • 举报
回复
使用synchronized来同步方法,只是对方法的同步,里面的东西是不同步的
ROBINAPOLLO 2008-04-20
  • 打赏
  • 举报
回复
在主线程SLEEP的时候,,子线程已经给B赋值1000了,,
然后子线程SLEEP..则主线程运行得到B值1000,,然后主线程得到得到运行
ROBINAPOLLO 2008-04-20
  • 打赏
  • 举报
回复
LZ,,,你的B的变量在M1日的时候已经先对其赋值1000了
wangshikang_it 2008-04-20
  • 打赏
  • 举报
回复
你并没有锁定什么 只是同步吧
int b=100相对于那个类来说 里面的方法都可以访问的到
b在m1()里值改变 m2()里就是你已经改变的值了
williamxa2008 2008-04-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 J_Factory 的回复:]
方法里只能有变量吧,还能内嵌方法?没用过

同步的方法之间是存在着竞争,而非同步的方法和同步方法之间没有竞争,所以在同步的方法中用到了相同的变量这时这些变量可以看成同步的,但在非同步和同步的方法中相同的变量不存在同步。

拿你的程序来说,m1是个同步的方法,它里面用到了b变量,m2是个非同步的方法,它也用到了b,这两个方法可以在同一时间对b进行操作的。相反要是m2也是一个同步的方法,那不会出…
[/Quote]
两个方法都是有synchronized,则这两个方法就是互斥的.假如两个方面一个有同步锁,一个没有,则是同步的......
所以t1.m2();输出的是1000.
其实你这个程序有点问题的,Thread.sleep(1000);这句话应抛出InterruptedException异常的,你必须对此作出处理才能正常的运行.完整的程序发给你以供参考.以后多多交流,谢谢......
import java.io.*;
public class TestLock implements Runnable {
int b = 100;

public synchronized void m1() throws Exception {
b = 1000;
Thread.sleep(5000);
System.out.println("b=" + b);
}

public void m2() {
System.out.println(b);
}

public void run() {
try {
m1();
} catch (Exception e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
TestLock tl = new TestLock();
Thread t = new Thread(tl);
t.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.toString();
}
tl.m2();
}
}

62,623

社区成员

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

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