1 什么是java object monitor

每个java对象头中都有锁状态位标记。java中在使用synchronize同步的时候,肯定是涉及到某个对象的锁。因此,在考虑同步的时候,首先要想到是同步的是哪个对象的锁。

在java字节码上,获取了某个对象的锁之后,进入时会调用monitorenter指令,在退出时会调用monitorexit指令。

可见,java object monitor是对java对象的锁的一种抽象。它和java对象是一对一的关系的。

在java中,通过java object monitor使得锁是和其保护的对象一一对应的。

2 关于synchronized关键字

它可以用来修饰普通方法,静态方法和修饰代码段。

修饰普通方法的时候,使用的monitor就是类对应的对象的锁。

修饰代码段的时候,使用的monitor也是类对象的对象的锁。

而修饰静态方法时,使用的monitor是类的class对象的锁,这样的monitor只有一个。

具体可以参考下面的博文:

http://www.cnblogs.com/paddix/p/5367116.html

3 为什么“只有拥有该对象的monitor的线程才可以调用该对象的wait()、notify()和notifyAll()方法”?

因为wait()、notify()和notifyAll()是object monitor提供的函数,在语义上,没有拥有该monitor的线程是不能调用它们的。java通过抛出异常来

保证程序在用法上满足这个语义。

4 为什么“wait/notify”方法必须要在synchronized的方法或者段中调用呢?

因为只有进入了synchronized方法或者方法段中的线程才拥有了该锁对象,只有拥有了该锁对象才能调用该锁对象的wait和notify方法。

5 下面的代码在wait之后呢?被唤醒之后,是接着wait后面的执行吗?

synchronized (object) {

while (<condition does not hold>)

object.wait();

// perform actions to condition

}

是的,被唤醒之后,它又重新获取了该锁之后,就会接着wait后面的执行。

例子:

public class Test {
    public static Object object = new Object();
    public static void main(String[] args) {
        Thread1 thread1 = new Thread1();
        Thread2 thread2 = new Thread2();
         
        thread1.start();
         
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
         
        thread2.start();
    }
     
    static class Thread1 extends Thread{
        @Override
        public void run() {
            synchronized (object) {
                try {
                    object.wait();
                } catch (InterruptedException e) {
                }
                System.out.println("线程"+Thread.currentThread().getName()+"获取到了锁");
            }
        }
    }
     
    static class Thread2 extends Thread{
        @Override
        public void run() {
            synchronized (object) {
                object.notify();
                System.out.println("线程"+Thread.currentThread().getName()+"调用了object.notify()");
          System.out.println("线程"+Thread.currentThread().getName()+"释放了锁");
            }
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
            System.out.println("同步块外的逻辑"+Thread.currentThread().getName());
        }
    }
}

先打印Thread1中要打印的内容,然后再打印Thread2中要打印的内容。

6 notify()和notifyAll()的使用

第一:调用 notify() 方法导致解除阻塞的线程是从因调用该对象的 wait() 方法而阻塞的线程中随机选取的,我们无法预料哪一个线程

将会被选择,所以编程时要特别小心,避免因这种不确定性而产生问题。

第二:除了 notify(),还有一个方法 notifyAll() 也可起到类似作用,唯一的区别在于,调用 notifyAll() 方法将把因调用该对象的

wait() 方法而阻塞的所有线程一次性全部解除阻塞。当然,只有获得锁的那一个线程才能进入可执行状态。

java object monitor的更多相关文章

  1. java Object解析

    java Object是所有对象的根父类,所有对象都直接或间接集成自该类. java 的Object类也比较简单,有equals(Object).toString().finalize() java方 ...

  2. Java Object 引用传递和值传递

    Java Object 引用传递和值传递 @author ixenos Java没有引用传递: 除了在将参数传递给方法(或函数)的时候是"值传递",传递对象引用的副本,在任何用&q ...

  3. Java Object 构造方法的执行顺序

    Java Object 构造方法的执行顺序 @author ixenos 为了使用类而做的准备工作包括三个步骤 1)加载:类加载器查找字节码(一般在classpath中找),从字节码创建一个Class ...

  4. Java Object 对象创建的方式 [ 转载 ]

    Java Object 对象创建的方式 [ 转载 ] @author http://blog.csdn.net/mhmyqn/article/details/7943411 显式创建 有4种显式地创建 ...

  5. Java Object 对象拷贝答疑

    Java Object 对象拷贝答疑 @author ixenos 摘要:在对象的clone过程需要注意的几点.关于关键字this.super 关于clone[对象拷贝] 在实际编程过程,有时候我们会 ...

  6. Java Object 对象拷贝

    Java Object 对象拷贝 @author ixenos JAVA 对象拷贝 Java里的clone分为:  1.浅拷贝:浅复制仅仅复制所考虑的对象,而不复制它所引用的对象,Object类里的c ...

  7. Java基础-SSM之Spring的POJO(Plain Old Java Object)实现AOP

    Java基础-SSM之Spring的POJO(Plain Old Java Object)实现AOP 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 上次我分享过Spring传统的A ...

  8. Java Object Clone

    Java Object Clone User user = new User(); user.setName("tom"); User user1 = new User(); us ...

  9. java Object转换成指定的类型

    java Object转换成指定的类型 /** * Object转成指定的类型 * @param obj * @param type * @param <T> * @return */ p ...

随机推荐

  1. POJ 2411Mondriaan's Dream

    题目: Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after prod ...

  2. 最全py2exe

    这次不是直接讲解下去,而是谈一下如何把我们写的游戏做成一个exe文件,这样一来,用户不需要安装python就可以玩了.扫清了游戏发布一大障碍啊! perl,python,java等编程语言,非常好用, ...

  3. 关于Redux到底是个什么鬼

    原文链接:https://zhuanlan.zhihu.com/p/20641377 我们故事的主人公,小明. 小明大学刚毕业,摆脱了宿舍的集体生活,自己在外面租了个一室一厅的小公寓住. 这是客厅的平 ...

  4. Codeforces 875C National Property(拓扑排序)

    题目链接  National Property 给定n个单词,字符集为m 现在我们可以把其中某些字母变成大写的.大写字母字典序大于小写字母. 问是否存在一种方案使得给定的n个单词字典序不下降. 首先判 ...

  5. JVM, JRE 和JDK

    JVM -- java virtual machine A Java virtual machine (JVM) is a process virtual machine that can execu ...

  6. 反向代理服务器(Reverse Proxy)

    反向代理服务器(Reverse Proxy)   普通代理服务器是帮助内部网络的计算机访问外部网络.通常,代理服务器同时连接内网和外网.首先内网的计算机需要设置代理服务器地址和端口,然后将HTTP请求 ...

  7. oralce中相关的概念整理

    [数据库名]  概念:就是一个数据库的标识,作用等同于我们的身份证的作用,假设一台机器上安装了多个数据库,那么每一个数据库都会有一个数据库名称相应,这些数据库名称在数据库被创建的时候,数据库名称也会被 ...

  8. Git以及github的使用方法(四),版本回退

    现在,你已经学会了修改文件,然后把修改提交到Git版本库,现在,再练习一次,修改readme.txt文件如下: Git is a distributed version control system. ...

  9. 树莓派 Zero W——随身钥匙扣

    前言 原创文章,转载引用务必注明链接.水平有限,如有疏漏,欢迎指正. 本文使用Markdown写成,为获得更好的阅读体验和正确的格式显示,请访问我的博客原文: http://www.cnblogs.c ...

  10. require.js使用

    无可奈何,二开项目用了require.js! 一道槛是挨不过去了 require官网: http://requirejs.org/ require.js cdn: <script src=&qu ...