【发布时间】:2018-07-20 09:30:20
【问题描述】:
我正在尝试实现具有固定数量的对象可用于池的对象池,如果池为空则使用等待,并在线程释放对象时通知。
我可以使用下面的程序实现上述所需的功能。
我想知道实施是否正确或从面试的角度需要任何修改?
import java.util.ArrayList;
import java.util.List;
class ObjectPool
{
static List objects = new ArrayList();
static
{
objects.add("Object One");
objects.add("Object Two");
}
public Object getObject()
{
synchronized(objects)
{
if(objects.isEmpty())
{
System.out.println(Thread.currentThread().getName() + " waiting as Object Pool is empty");
try {
objects.wait();
System.out.println(Thread.currentThread().getName() + " Got Notification");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Object locked = objects.get(objects.size()-1);
objects.remove(locked);
System.out.println(Thread.currentThread().getName() + " got lock of object : "+ locked);
return locked;
}
}
public boolean release(Object released)
{
synchronized(objects)
{
System.out.println(Thread.currentThread().getName() + " releasing Object : "+released);
objects.notify();
return objects.add(released);
}
}
}
public class MainforObjectPool implements Runnable
{
static ObjectPool p = new ObjectPool();
public static void main(String[] args)
{
MainforObjectPool m = new MainforObjectPool();
Thread t1 = new Thread(m,"thread 1");
Thread t2 = new Thread(m,"thread 2");
Thread t3 = new Thread(m,"thread 3");
Thread t4 = new Thread(m,"thread 4");
Thread t5 = new Thread(m,"thread 5");
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
System.out.println("Main Thread Completed");
}
public void run()
{
Object locked = p.getObject();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
p.release(locked);
}
}
【问题讨论】:
-
我会问以防万一:您是否知道免费提供的对象池实现,例如Apache Commons Pool?除非您将此作为一种编码练习,否则您应该使用现有的库。
-
是的,它需要大量修改。除非你面试的是一个非常初级的角色,否则这种对同步的幼稚使用会引发巨大的危险信号。
static是 Just Wrong TM。 -
嗨@BoristheSpider,您能否分享所需的修改或任何我可以用来理解正确实现的链接形式,TM 意味着?
-
抱歉,没有任何代码是可挽救的。我建议丢弃它并学习如何使用
ArrayBlockingQueue。如果你想看看如何正确实现一个池,那么 Apache Commons Pool 是open source。 -
另一件事 - 要进行全面的代码审查,您可以尝试 Code Review SE。
标签: java design-patterns object-pooling objectpool