QQ1252776430 2015-12-08 11:13 采纳率: 22%
浏览 3978

java synchronized(this)模块中this参数的含义。

定义了如下3个类,大致情况的主进程同时启动两个test2和test3线程。
test2和test3的run方法内部都添加了synchronized模块,当两个模块中的参数互指或互不指,即test2种模块参数指向test3同时test3的参数指向test2,或test2和test3的参数都指向自己this时,运行结果为2个test2,test3线程互相等待但test2和test3线程同时运行:
new test()
t2 0
t3 0
t3 1
t2 1
t3 2
t2 2
t2 3
t3 3
t3 4
t2 4
t3 5
t2 5
t2 0
t3 6
t2 1
t3 7
t3 8
t2 2
t2 3
t3 9
t2 4
t3 10
t2 5
t3 0
t3 1
t3 2
t3 3
t3 4
t3 5
t3 6
t3 7
t3 8
t3 9
t3 10

当test2的参数指向test3,test3的参数指向自己this;或者test2的参数指自己,test3的参数指test2时,运行结果是4个test2,test3线程互相等待,同时只有一个线程运行:
new test()
t2 0
t2 1
t2 2
t2 3
t2 4
t2 5
t3 0
t3 1
t3 2
t3 3
t3 4
t3 5
t3 6
t3 7
t3 8
t3 9
t3 10
t2 0
t2 1
t2 2
t2 3
t2 4
t2 5
t3 0
t3 1
t3 2
t3 3
t3 4
t3 5
t3 6
t3 7
t3 8
t3 9
t3 10

并且不论synchronized块的参数是什么,同一个对象的运行是被锁住了,即两个test2和两个test3之间只能同时运行一个。
想问下高手jvm如何产生这个特性的原理是什么,这个参数又有什么方面的应用啊?

public class test implements Runnable{

Thread t;
Thread t1;
test2 t2=new test2() ;
test3 t3=new test3();
Thread T3;
Thread TT3;

test()
{

    System.out.println("new test()");
    t=new Thread(this);
    t1=new Thread(this);

    t2.t3=t3;
    t3.t2=t2;
    t.start();
    t1.start();
    T3=new Thread(t3);
    TT3=new Thread(t3);
    T3.start();
    TT3.start();


}

public void run()
{   

    t2.speak();
}




public static void main(String[] args) 
{
    // TODO Auto-generated method stub

new test( );

}

}

public class test2
{

test3 t3;

public void speak()
{

synchronized(t3){   //test2中参数指向test3线程

for(int i=0;i<=5;i++)
{


    System.out.println("t2 "+i);
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    }




}

}

}

public class test3 implements Runnable{

test2 t2;

public  void run()
{
    synchronized(this){    //synchronized参数指向自己

for(int i=0;i<=10;i++)
{
    System.out.println("t3 "+i);
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}
}

}

  • 写回答

3条回答 默认 最新

  • 毕小宝 博客专家认证 2015-12-08 11:56
    关注

    JVM的synchronized是java并发环境下的同步机制,这是基于锁的,多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题。
    Java中的每个对象都有一个锁(lock),或者叫做监视器(monitor),当一个线程访问某个对象的synchronized方法时,将该对象上锁,其他任何线程都无法再去访问该对象的synchronized方法了(这里是指所有的同步方法,而不仅仅是同一个方法),直到之前的那个线程执行方法完毕后(或者是抛出了异常),才将该对象的锁释放掉,其他线程才有可能再去访问该对象的synchronized方法。

    评论

报告相同问题?

悬赏问题

  • ¥15 安装svn网络有问题怎么办
  • ¥15 Python爬取指定微博话题下的内容,保存为txt
  • ¥15 vue2登录调用后端接口如何实现
  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥15 latex怎么处理论文引理引用参考文献