高人 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方法);
}
}
结果如下: 实现了锁的效果 展开
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方法);
}
}
结果如下: 实现了锁的效果 展开
展开全部
第一个锁用的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方法");
}
}
第二个锁直接锁住了类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方法");
}
}
展开全部
一个比较简单的解释,看看能不能帮助你理解:
主要问题在这里:
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上加锁就不一样了,因为其实只有这一把锁,你在这里加锁相当于把这个锁给藏起来了,拿不到锁,钥匙再多也没用啊~
看看能否理解~
主要问题在这里:
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上加锁就不一样了,因为其实只有这一把锁,你在这里加锁相当于把这个锁给藏起来了,拿不到锁,钥匙再多也没用啊~
看看能否理解~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为锁的对象不同。
首先,通过你的main方法,我觉得你目的是让线程A和线程B有序访问obj对象,所以锁的对象应该是Class B。
其次,synchronized(this),我觉得你根本没有理解this是什么。在你的代码里面,this其实是指线程对象(A或者B).
首先,通过你的main方法,我觉得你目的是让线程A和线程B有序访问obj对象,所以锁的对象应该是Class B。
其次,synchronized(this),我觉得你根本没有理解this是什么。在你的代码里面,this其实是指线程对象(A或者B).
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询