zoukankan      html  css  js  c++  java
  • 多个人过门引出线程安全问题

    package com.dwz.concurrency2.chapter6;
    /**
     * SharedResource
     */
    public class Gate {
        private int counter = 0;
        private String name = "Nobody";
        private String address = "Nowhere";
        /**
         * 临界值
         * @param name
         * @param address
         * synchronized
         * 
         * 将数据的读写都加在一个锁里面,极大影响程序执行效率,怎样优化?
         */
        public void pass(String name, String address) {
            this.counter++;
            /*race*/
            this.name = name;
            this.address = address;
            verify();
        }
        
        public 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.dwz.concurrency2.chapter6;
    
    public class User extends Thread {
        private final String myName;
        private final String myAddress;
        private final Gate gate;
        
        public User(String myName, String myAddress, Gate gate) {
            super();
            this.myName = myName;
            this.myAddress = myAddress;
            this.gate = gate;
        }
        
        @Override
        public void run() {
            System.out.println(myName + " BEGIN");
            while(true) {
                this.gate.pass(myName, myAddress);
            }
        }
    }

    测试代码

    package com.dwz.concurrency2.chapter6;
    
    public class Client {
        public static void main(String[] args) {
            Gate gate = new Gate();
            User bj = new User("beilao", "beijing", gate);
            User sh = new User("shanglao", "shanghai", gate);
            User gz = new User("guanglao", "guangzhou", gate);
            
            bj.start();
            sh.start();
            gz.start();
        }
    }

    测试结果:不是线程安全的,当pass()上加synchronized时线程安全

    但是将数据的读写都加在一个锁里面,极大影响程序执行效率,怎样优化?

  • 相关阅读:
    Bootstrap基础(七):按钮
    Bootstrap基础(六):表单
    Bootstrap基础(五):表格
    Bootstrap基础(四):代码
    Bootstrap基础(三):排版
    Bootstrap基础(二):网格系统
    Bootstrap基础(一):CSS 概览
    本人承接各种.Net网站制作,软件项目等业务。完美帮您定做
    iOS沙盒路径的查看和使用
    asp.net 源码坊4-6源码发布
  • 原文地址:https://www.cnblogs.com/zheaven/p/12116444.html
Copyright © 2011-2022 走看看