| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1031 人关注过本帖
标题:synchronized(this)里的this什么意思?
只看楼主 加入收藏
msl12
Rank: 1
等 级:新手上路
帖 子:152
专家分:0
注 册:2015-2-6
结帖率:25%
收藏
 问题点数:0 回复次数:4 
synchronized(this)里的this什么意思?
看到了一段代码:
----------------------------------------------------------------------------------------
class Zhangsan {
    public void say() {
        System.out.println("张三对李四说:你给我画,我就把书给你");
    }

    public void get() {
        System.out.println("张三得到了画");
    }
}

class Lisi {
    public void say() {
        System.out.println("李四对张三说:你给我书,我就把画给你");
    }

    public void get() {
        System.out.println("李四得到了书");
    }
}

public class Test2 implements Runnable {
    private static Zhangsan zs = new Zhangsan();
    private static Lisi ls = new Lisi();
    private boolean flag = false;

    public void run() {
        if (flag) {
            synchronized (zs) {                                    //此处的zs或者说synchronized () 括号里的东西表示什么意思?
                zs.say();

                synchronized (ls) {
                    zs.get();
                }
            }
        } else {
            synchronized (ls) {
                ls.say();
               
                synchronized (zs) {

                    ls.get();
                }
            }
        }
    }

    public static void main(String args[]) {
        Test2 t1 = new Test2();
        Test2 t2 = new Test2();
        t1.flag = true;
        t2.flag = false;
        Thread thA = new Thread(t1);
        Thread thB = new Thread(t2);
        thA.start();
        thB.start();
    }
}
搜索更多相关主题的帖子: public 
2015-10-03 18:59
msl12
Rank: 1
等 级:新手上路
帖 子:152
专家分:0
注 册:2015-2-6
收藏
得分:0 
"//"前面那行,zs换成ls表示什么意思呢
2015-10-03 19:02
林月儿
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:湖南
等 级:版主
威 望:138
帖 子:2277
专家分:10647
注 册:2015-3-19
收藏
得分:0 
好像死锁的样子

剑栈风樯各苦辛,别时冰雪到时春
2015-10-03 20:53
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
收藏
得分:0 
这个问题的答案可大可小

1.浅显版
synchronized()中填写的是Java的锁对象,
Java的锁对象能是任何java.lang.Object及其子类


public static void synchronized test(){}
// 此时 synchronized 锁定的对象默认为Test.class,没错,Test.class也是继承自java.lang.Object的
// 等价于

public static void test() {
    synchronized(Test.class){
    }
}


///////////

在synchronized所保护的代码块中,有且只能一个线程能进入该代码执行(也就是抢到锁的线程)
从你的例子来看

T1:
    synchronized(zs)
        synchronized(ls)

T1:
    synchronized(ls)
        synchronized(zs)

在特定情况下机器容易造成死锁,注意,这里只是说容易,并不是说一定


程序代码:
死锁情况:T1和T2交叉执行
+-------+--------+------+------+
|  TIME | THREAD |  zs  |   ls |
+=======+========+======+======+
| 00:00 |   T1   | HOLD | WAIT |
| 00:00 |   T2   | WAIT | HOLD |
+-------+--------+------+------+


规避死锁情况:T1和T2正好错开执行
+-------+--------+------+------+
|  TIME | THREAD |  zs  |   ls |
+=======+========+======+======+
| 00:00 |   T1   | HOLD | WAIT |
| 00:00 |   T2   | WAIT |      |
+-------+--------+------+------+
| 00:01 |   T1   | HOLD | HOLD |
| 00:01 |   T2   | WAIT |      |
+-------+--------+------+------+
| 00:02 |   T1   |      |      |
| 00:02 |   T2   |      | HOLD |
+-------+--------+------+------+
| 00:03 |   T1   |      |      |
| 00:03 |   T2   | HOLD | HOLD |
+-------+--------+------+------+


2.深入版
要理解synchronized(),就必须先了解Java多线程的同步原语和Java对象内存模型

[ 本帖最后由 神vLinux飘飘 于 2015-10-6 23:03 编辑 ]

淘宝杜琨
2015-10-06 22:39
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:0 

仰望星空...........不忘初心!
2015-10-06 23:02
快速回复:synchronized(this)里的this什么意思?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.039863 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved