zoukankan      html  css  js  c++  java
  • 多线程设计模式-单线程执行模式

    单线程执行模式

    场景:有一个门,记录每次进入们的用户的姓名和来历

    package com.ln.concurrent.chapter5;
    /**
     * @ProjectName: java-concurrency
     * @Package: com.ln.concurrent.chapter5
     * @version: 1.0
     */
    
    /**
     * @ClassName:Gate
     * @Author:linianest
     * @CreateTime:2020/3/24 9:06
     * @version:1.0
     * @Description TODO: 定义共享资源
     */
    
    /**
     * SharedResource
     */
    public class Gate {
        private int counter = 0;
        private String name = "NoBody";
        private String address = "NoWhere";
    
        /**
         * 临界值
         * @param name
         * @param address
         */
        public synchronized void pass(String name, String address) {
            this.counter++;
            this.name = name;
            this.address = address;
            verify();
        }
    
        private void verify() {
            if (this.name.charAt(0) != this.address.charAt(0)) {
                System.out.println("************BROKEN**************" + toString());
            }
        }
    
        @Override
        public String toString() {
            return "NO." + counter + ":" + name + "," + address;
        }
    }
    
    
    package com.ln.concurrent.chapter5;
    /**
     * @ProjectName: java-concurrency
     * @Package: com.ln.concurrent.chapter5
     * @version: 1.0
     */
    
    /**
     * @ClassName:User
     * @Author:linianest
     * @CreateTime:2020/3/24 9:11
     * @version:1.0
     * @Description TODO: 定义调用资源的线程
     */
    public class User extends Thread {
    
        private final String myName;
        private final String myAdress;
        private final Gate gate;
        private static volatile int number;
    
        public User(String myName, String myAdress, Gate gate) {
            this.myName = myName;
            this.myAdress = myAdress;
            this.gate = gate;
        }
    
    
        @Override
        public void run() {
            System.out.println(myName + " BEGIN");
            while (true) {
                this.gate.pass(myName, myAdress);
                try {
                    Thread.sleep(1_000L);
                    System.out.println("the thread " + Thread.currentThread().getName() + " coming ,the number is " + (number++));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    
    package com.ln.concurrent.chapter5;
    /**
     * @ProjectName: java-concurrency
     * @Package: com.ln.concurrent.chapter5
     * @version: 1.0
     */
    
    /**
     *@ClassName:Client
     *@Author:linianest
     *@CreateTime:2020/3/24 9:17
     *@version:1.0
     *@Description TODO: 实现一个资源每次只有一个线程访问
     */
    public class Client {
        public static void main(String[] args) {
            Gate gate = new Gate();
            User bj = new User("Baobao","Beijin",gate);
            User sh = new User("ShangLao","ShangHai",gate);
            User gz = new User("GuangLao","GuangZhou",gate);
    
            bj.start();
            sh.start();
            gz.start();
        }
    }
    
    

    通过加锁的方式实现资源每次只能被一个线程访问

  • 相关阅读:
    Redis单点登录
    MySQL有哪些存储引擎,各自的优缺点,应用场景
    MySQL慢查询优化、索引优化、以及表等优化总结
    Redis缓存和MySQL数据一致性方案详解
    Jenkies+github实现代码自动构建
    Python基础-day14-单元测试注册小例子
    Python基础-day13-unitest框架(Suite、runner)及生成报告,附带最新的HTMLTestRunnerNew.py文件
    Python基础-day11-继承和动态设置属性
    Python基础-day10-类的创建和调用
    Python基础-day03 字符串
  • 原文地址:https://www.cnblogs.com/ryyy/p/14228158.html
Copyright © 2011-2022 走看看