• 同步块:synchronized(同步监视器对象){同步运行代码片段}


    package seday10;

    import seday03.Test2;

    /**
    * @author xingsir
    * 同步块:synchronized(同步监视器对象){需要同步运行的代码片段}
    * 同步块可以更准确的控制需要同步运行的代码片段,有效的缩小同步范围可以保证并发安全的前提下尽可能的提高并发 的效率。
    */
    public class syncDemo2 {

    public static void main(String[] args) {
    Eat eat =new Eat();//实例化一个对象eat
    Thread t1=new Thread() {//创建线程一
    public void run() {
    eat.order();//调用
    }
    };
    Thread t2=new Thread() {//创建线程二一
    public void run() {
    eat.order();//调用
    }
    };
    t1.start();//线程调用
    t2.start();//线程调用
    }
    }


    /*
    * 若不使用,synchronized (this) {},结果如下:
    Thread-1:开始浏览菜单。。。。。
    Thread-0:开始浏览菜单。。。。。
    Thread-1:服务员点餐...
    Thread-0:服务员点餐...
    Thread-1:上菜开吃!
    Thread-0:上菜开吃!
    假设就一个服务员的话,就存在问题
    */


    /*使用,synchronized (this) {}。执行结果:可以看出线程Thread-1处理完后Thread-0才开始处理
    Thread-1:开始浏览菜单。。。。。
    Thread-0:开始浏览菜单。。。。。
    Thread-1:服务员点餐...
    Thread-1:上菜开吃!
    Thread-0:服务员点餐...
    Thread-0:上菜开吃!

    */


    class Eat{
    public void order() {
    Thread thread=Thread.currentThread();//主进程
    try {
    System.out.println(thread.getName()+":开始浏览菜单。。。。。");
    Thread.sleep(5000);//阻塞5000毫秒
    //服务员就一个点餐需要排队,所以
    synchronized (this) {//this为同步监视器对象,所以需要同步运行的代码片段
    System.out.println(thread.getName()+":服务员点餐...");//打印出线程名字
    Thread.sleep(5000);//阻塞5000毫秒
    }
    System.out.println(thread.getName()+":上菜开吃!");//打印出线程名字
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    }

  • 相关阅读:
    小米笔试(09-15)
    58同城笔试(09-14)
    Java中的static总结
    【Linux】常用代码
    【项目部署】上线
    入职一年高校的体会
    小团队管理总结
    从windows到Linux的再次转身,这次是硬件开发
    了解到雪花算法
    CCAI观后
  • 原文地址:https://www.cnblogs.com/xingsir/p/12083652.html
Copyright © 2020-2023  润新知