• 举例单例模式,并说明作用。


    public class Logger {
      private FileWriter writer;
      private static final Logger instance = new Logger();
    
      private Logger() {
        File file = new File("/Users/logs/log.txt");
        writer = new FileWriter(file, true); //true表示追加写入
      }
      
      public static Logger getInstance() {
        return instance;
      }
      
      public void log(String message) {
        writer.write(mesasge);
      }
    }
    
    // Logger类的应用示例:
    public class UserController {
      public void login(String username, String password) {
        // ...省略业务逻辑代码...
        Logger.getInstance().log(username + " logined!");
      }
    }
    
    public class OrderController {  
      public void create(OrderVo order) {
        // ...省略业务逻辑代码...
        Logger.getInstance().log("Created a order: " + order.toString());
      }
    }

    并发条件下如果login接口create同时被调用,logger实例如果有多个,可能会出现日志被覆盖的情况。
    现将 Logger 设计成一个单例类,程序中只允许创建一个 Logger 对象,所有的线程共享使用的这一个 Logger 对象,共享一个 FileWriter 对象,而 FileWriter 本身是对象级别线程安全的,也就避免了多线程情况下写日志会互相覆盖的问题。

    import java.util.concurrent.atomic.AtomicLong;
    public class IdGenerator {
      // AtomicLong是一个Java并发库中提供的一个原子变量类型,
      // 它将一些线程不安全需要加锁的复合操作封装为了线程安全的原子操作,
      // 比如下面会用到的incrementAndGet().
      private AtomicLong id = new AtomicLong(0);
      private static final IdGenerator instance = new IdGenerator();
      private IdGenerator() {}
      public static IdGenerator getInstance() {
        return instance;
      }
      public long getId() { 
        return id.incrementAndGet();
      }
    }
    
    // IdGenerator使用举例
    long id = IdGenerator.getInstance().getId();

    多个AtomicLong产生出的是重复的ID,因为AtomicLong并非单例,并且其value值也是volatile线程间可见。
    而通过将IdGenerator静态化地单例化,作为唯一对象,生成出的ID不会重复。
    如果程序中有两个对象,那就会存在生成重复 ID 的情况。

  • 相关阅读:
    format的用法

    TADOQuery池
    10分钟了解JSON Web令牌(JWT)
    PHP操作Redis数据库常用方法
    平时在PHP编码时有没有注意到这些问题
    利用 Composer 一步一步构建自己的 PHP 框架(四)——使用 ORM
    ORM的详解
    oracle NLS_LANG环境变量设置
    验证选择每日学习总结:DropDownList是否已选择验证、存储过程参数为sql字符串问题、将截断字符串或二进制数据。\r\n语句已终止
  • 原文地址:https://www.cnblogs.com/ukzq/p/16669066.html
Copyright © 2020-2023  润新知