zoukankan      html  css  js  c++  java
  • 同步块: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();
    }
    }

    }

  • 相关阅读:
    C语言-第四周作业
    第8次Scrum会议(10/20)【欢迎来怼】
    例行报告(20171011-20171019)
    C语言--第二周作业评分和总结(5班)
    C语言-第三周作业
    第一次Scrum会议(10/13)【欢迎来怼】
    单元测试之四则运算
    四则运算V1.1
    例行报告(20170927-20171010)
    C语言--第一周作业评分和总结(5班)
  • 原文地址:https://www.cnblogs.com/xingsir/p/12083652.html
Copyright © 2011-2022 走看看