【问题标题】:Java Singleton Thread class objectJava 单例线程类对象
【发布时间】:2019-06-19 11:13:37
【问题描述】:

我有一门课如下

public class JobThread implements Runnable {

    private JobService jobService;
    private long interval;

    public JobThread(JobService jobService, long interval) {
        this.jobService = jobService;
        this.interval = interval;
    }

    @Override
    public void run() {
      // some stuff
    }
}

这是班级正在按预期工作。但我想让这个类成为单例类。基本上这个类通过它的 jar 文件被多个项目使用。此类的参数是项目特定的。但是,如果它们根据业务逻辑具有此类的多个实例,则毫无意义。所以我想把它做成单例。这样他们就不能为这个类创建多个对象。谁能告诉我该怎么做?

【问题讨论】:

  • 您是否尝试在许多不同的项目中使用相同的单例?
  • 没有。每个项目一个单例。 jar 的多个副本意味着多个单例类。

标签: java multithreading singleton


【解决方案1】:

你可以按照单例类的规则,使其成为单例类。

 public class JobThread implements Runnable
{

  private static JobService jobService;
  private static long interval;
  private static JobThread myObj;

  static
  {
    myObj = new JobThread ();
  }

  private JobThread ()
  {

  }

   @Override public void run ()
  {
    //some stuff
  }

  public static JobThread getInstance (JobService jobService_p,
                       long interval_p)
  {
    jobService = jobService_p;
    interval = interval_p;
    return myObj;
  }
}

【讨论】:

  • getInstance() 中的参数是不必要的。这些值为static,所以最好不带参数创建并加上setters
【解决方案2】:

您可以使用标准的单例模式。在 createInstance 方法中,如果不可用,您可以尝试获取锁 createInstance 可以抛出异常,否则返回对象

Lock lock = ...;
public JobInstance createInstance()
{

    if (lock.tryLock()) {
            //Create instance of your object here

      } else {
          // throw object already exist exception
    }
}   

当 run 方法在 finalize 中完成时,你必须释放锁,以确保在 run 崩溃而不释放锁的情况下进行适当的清理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-03
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多