日期:2014-05-20  浏览次数:20832 次

这段网上代码的synchronized加的莫名其妙,还是理解不了.....
public class ThreadPoolExecutorTest
{

   private static int queueDeep = 4;

   public void createThreadPool()
   {

       ThreadPoolExecutor tpe = new ThreadPoolExecutor(2, 4, 3, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(queueDeep), new ThreadPoolExecutor.DiscardOldestPolicy());

// 向线程池中添加 10 个任务
for (int i = 0; i < 10; i++)
{
                    //.....
                   while (getQueueSize(tpe.getQueue()) >= queueDeep)
   {
System.out.println("队列已满,等3秒再添加任务");
                   }
                 }
    }
    private synchronized  int getQueueSize(Queue queue)
    {

return queue.size();
    }
    public static void main(String[] args)
    {

ThreadPoolExecutorTest test = new ThreadPoolExecutorTest();
test.createThreadPool();
    }
}
主体代码就是这些,这里有一个方法getQueueSize,被加了锁,这说明,如果有多个线程同时访问类ThreadPoolExecutorTest 的getQueueSize方法时,只有获得锁的线程,才能进行访问,
问题现在是,只有一个主线程在访问这个方法
吧(通过createThreadPool方法),这里还加这个锁有什么意思啊!我自己做了测试不加也没啥啊,还是我理解错了.....

------解决方案--------------------
本人认为没有必要加入
1 ArrayBlockingQueue是线程安全的

下面是size方法的源代码

    public int size() {
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {