高人 java多线程 synchronized() 括号里面的参数不同结果也不同 求解 下面是我写的代码

第一个不可以实现锁的效果第二个可以实现为什么classAextendsThread{Bb;publicA(Bb){this.b=b;}publicvoidrun(){sy... 第一个不可以实现锁的效果 第二个可以实现 为什么
class A extends Thread
{
B b;
public A(B b){
this.b=b;
}
public void run(){
synchronized(this)
{
b.test();
System.out.println(getName()+"方法开始停止");
try
{
sleep(5000);
}
catch (Exception e)
{
}
System.out.println(getName()+"方法重新运行");
}
}
public static void main(String[] args)
{
B obj=new B();
A obj1=new A(obj);
A obj2=new A(obj);
obj1.start();
obj2.start();
}
}
class B
{
public void test(){

System.out.println(我是B方法);
}
}

结果如下: 没有实现锁的效果

第二个代码,其他没变 就改了synchronized中的参数 将this改成b
class A extends Thread
{
B b;
public A(B b){
this.b=b;
}
public void run(){
synchronized(b)
{
b.test();
System.out.println(getName()+"方法开始停止");
try
{
sleep(5000);
}
catch (Exception e)
{
}
System.out.println(getName()+"方法重新运行");
}
}
public static void main(String[] args)
{
B obj=new B();
A obj1=new A(obj);
A obj2=new A(obj);
obj1.start();
obj2.start();
}
}
class B
{
public void test(){

System.out.println(我是B方法);
}
}
结果如下: 实现了锁的效果
展开
 我来答
百度网友c68fdc5
2012-08-08
知道答主
回答量:52
采纳率:0%
帮助的人:27.7万
展开全部
第一个锁用的this,this是一个指向对象的引用的关键字,所以你第一个锁实际是锁住了对A的引用,而程序中你创建了两个引用分别指向A的两个实例,所以锁没有生效
第二个锁直接锁住了类B,所以在实际程序调用中就会按照你锁的顺序进行

这样修改一下就能看出你锁住的是对A的一个实例的引用了

class ThreadTest extends Thread
{
B b;
public ThreadTest(B b){
this.b=b;
}
public void run(){
synchronized(this)
{
b.test();
System.out.println(getName()+"方法开始停止");
try
{
sleep(5000);
}
catch (Exception e)
{
}
System.out.println(getName()+"方法重新运行");
}
}
public static void main(String[] args)
{
B obj=new B();
ThreadTest obj1=new ThreadTest(obj);
// ThreadTest obj2=new ThreadTest(obj);

Thread a1 = new Thread(obj1);

Thread a2 = new Thread(obj1);

// Thread a2 = new Thread(obj2);

a1.start();

a2.start();
// obj1.start();
// obj2.start();
}
}
class B
{
public void test(){

System.out.println("我是B方法");
}
}
jiangshuiy
2012-08-08 · TA获得超过169个赞
知道答主
回答量:167
采纳率:50%
帮助的人:132万
展开全部
一个比较简单的解释,看看能不能帮助你理解:
主要问题在这里:
B obj=new B();
A obj1=new A(obj);
A obj2=new A(obj);
这里明显obj1和obj2是两个不同的对象;
但这两个对象又都引用了同一个对象B的实例obj,也就是说obj有两把钥匙,都可以对其进行操作;

下面就好理解了:
在this上加锁,也就是分别锁住了obj1和obj2,但你锁住这个的时候,另外一个仍然有对obj操作的钥匙啊,所以没有作用;

但在obj上也就是b上加锁就不一样了,因为其实只有这一把锁,你在这里加锁相当于把这个锁给藏起来了,拿不到锁,钥匙再多也没用啊~

看看能否理解~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
暗蓝幽谷
2012-08-08
知道答主
回答量:20
采纳率:0%
帮助的人:8.2万
展开全部
因为锁的对象不同。
首先,通过你的main方法,我觉得你目的是让线程A和线程B有序访问obj对象,所以锁的对象应该是Class B。
其次,synchronized(this),我觉得你根本没有理解this是什么。在你的代码里面,this其实是指线程对象(A或者B).
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式