zoukankan      html  css  js  c++  java
  • 图解java多线程设计模式之一一synchronized实例方法体

    synchronized实例方法体和synchronized代码块

    synchronied void method(){
    
                .......
            }
    

    这个等同于下面将方法体用synchronized(this)代码块包围起来

    void method(){
        synchronized(this) {
            .......
        }
    }
    

     这也就是说,synchronized实例方法是使用this(实例对象)的锁来执行线程的互斥处理的

    如果想用synchronized锁方法那么,需保证只有一个实例对象,如果你将

    用这个锁Thread内的一个方法,则,每个xxxThread.synchronizedMethod执行时,锁的是每个线程实例

    ,那个锁就不起作用了;只有3个线程都锁同一个对象才能保证互斥;

    在single Threaded Execution中,三个人频繁通过一个只允许一个经过的门的情形

    当人们通过门的时候,统计人数便会增加.另外程序还会记录通行者的"姓名与地址"

    思路即UserThread建三个线程,gate类表示门

    自己设计UserThread下面有一个进入门方法 使用synchronized修饰

        public synchronized void entergate() throws InterruptedException {
            System.out.println(this.addr+":  getCount***********"+gate.getCount());
            Thread.sleep(1* new Random().nextInt(10));
    
            gate.setCount(gate.getCount()+1);
           gate.setName(this.name);
           gate.setAddr(this.addr);
    
        }
    

     这个就会出现问题,因为3个线程,每个线程在执行entergate()锁的都是自己对象,那么就不能保证设计目的了

    找出错误为下图

      

  • 相关阅读:
    《程序员修炼之道:从小工到专家》读后感2
    Java第五节课总结
    FirstJavaWeb
    Java第四节课总结
    《程序员修炼之道:从小工到专家》读后感1
    Java第三节课总结
    递归回文
    原码、补码和反码
    Java第二节课总结
    C++ STL的容器类型
  • 原文地址:https://www.cnblogs.com/zytcomeon/p/14187967.html
Copyright © 2011-2022 走看看