• 同步块: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();
    }
    }

    }

  • 相关阅读:
    nginx thinkphp rewrite配置项
    mysql主从配置,主从服务器都是全新安装myql的情景
    mysql提示启动成功,但statu是isstopped,重启后正常
    mysql怎么设置密码都不正确的一个解决方法
    linux统计文件个数及代码总行数
    mysqld启动失败时日志查看命令
    .tar.xz 的解压方式 centos
    CentOS 安装Erlang
    vector android:fillType gradient android:endX attribute not found
    found an invalid color
  • 原文地址:https://www.cnblogs.com/xingsir/p/12083652.html
Copyright © 2020-2023  润新知