注册 登录
编程论坛 JAVA论坛

synchronized(this)里的this什么意思?

msl12 发布于 2015-10-03 18:59, 1040 次点击
看到了一段代码:
----------------------------------------------------------------------------------------
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();
    }
}
4 回复
#2
msl122015-10-03 19:02
"//"前面那行,zs换成ls表示什么意思呢
#3
林月儿2015-10-03 20:53
好像死锁的样子
#4
神vLinux飘飘2015-10-06 22:39
这个问题的答案可大可小

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 编辑 ]
#5
Susake2015-10-06 23:02
1