java - synchronized在修饰代码块的时候,括号后面要跟什么啊?

查看:220
本文介绍了java - synchronized在修饰代码块的时候,括号后面要跟什么啊?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

package basic;

public class TestSynchronizedObject {

    public static void main(String[] args) {
        final TestSynchronizedObject testSynchronizedObject_first = new TestSynchronizedObject();
        final TestSynchronizedObject testSynchronizedObject_second = new TestSynchronizedObject();
        final MyObject myObject_first = new MyObject();
        final MyObject myObject_seconde = new MyObject();
        new Thread("线程A") {

            @Override
            public void run() {
                myObject_first.print("线程A");
            }
        }.start();
        new Thread("线程B") {

            @Override
            public void run() {
                myObject_seconde.print("线程B");
            }
        }.start();
    }
}

class MyObject {

    public void print(String str) {
        System.out.println("线程" + Thread.currentThread().getName() + "开始执行");
        synchronized ("") {
            for (int i = 0; i < 10; i++) {
                System.out.println(str + " ." + i + ". ");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                }
            }
        }
        System.out.println("线程" + Thread.currentThread().getName() + "执行结束");
    }
}
//输出结果:
//线程线程A开始执行
//线程A .0. 
//线程线程B开始执行
//线程A .1. 
//线程A .2. 
//线程A .3. 
//线程A .4. 
//线程A .5. 
//线程A .6. 
//线程A .7. 
//线程A .8. 
//线程A .9. 
//线程B .0. 
//线程线程A执行结束
//线程B .1. 
//线程B .2. 
//线程B .3. 
//线程B .4. 
//线程B .5. 
//线程B .6. 
//线程B .7. 
//线程B .8. 
//线程B .9. 
//线程线程B执行结束

查阅相关文档,当synchronized修饰代码块的时候,表示线程在执行的时候会将synchronized括号中的对象上锁。(注意这个对象可以是任意类的对象,也可以使用this关键字)。但是我这里明明是两个实例,而且在synchronized修饰代码块的时候,我的括号中明明没有指定在什么对象上使用锁,为什么是这样的打印结果呢?

解决方案

synchronized (lock-object) {
}

括号后面要跟一个对象,这个对象充当的作用。
synchronized(""),这里你把一个空字符串当成锁,并因此认为你没有指定锁住哪个对象。
而实际上,空字符串本身就是一个对象。并且,你有两个实例,并把空字符串喂给它们,这两个实例实际上持有的是同一个对象。

  1. 在Java中,全部都是对象, 空字符串也是对象。

  2. 常量字符串,比如空字符串,都放在常量池里,两个实例引用的空字符串实际上就是常量池里的空字符串,是同一个对象。

这篇关于java - synchronized在修饰代码块的时候,括号后面要跟什么啊?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆