Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么内部类方法无法同步外部类中的对象?_Java_Synchronized - Fatal编程技术网

Java 为什么内部类方法无法同步外部类中的对象?

Java 为什么内部类方法无法同步外部类中的对象?,java,synchronized,Java,Synchronized,我遇到了一个问题:内部类方法是否无法同步外部类中的对象?stackoverflow的回答告诉我:没有。但我真的想知道原因 例如: 我设计了一个线程池,最多有5个线程来完成工作 public class ThreadPool{ // Ignore the Task class private LinkedList<Task> tasks; Executor[] executors = new Executor[5]; private st

我遇到了一个问题:内部类方法是否无法同步外部类中的对象?stackoverflow的回答告诉我:没有。但我真的想知道原因

例如: 我设计了一个线程池,最多有5个线程来完成工作

public class ThreadPool{

     // Ignore the Task class 
     private LinkedList<Task> tasks;

     Executor[] executors = new Executor[5];

     private static ThreadPool pool = null;

     private ThreadPool() {
        tasks = new LinkedList<Task>();
        for (int i = 0; i < 5; i++) {
            executors[i] = new Executor(i);

        }
    }

    public static ThreadPool getInstance() {
        if (pool == null) {
            pool = new ThreadPool();
        }
        return pool;
    }

    public void addTask(Task task) {
        /** igore code here*/
    }

    private class Executor extends Thread {

        private int i;
        public Executor(int i) {
            this.i = i;
            start();
        }

                public void run() {
                Task task = null;
                synchronized (tasks) {

                    if (tasks.size() == 0) {
                        System.out.println("tasks's size is : " + tasks.size());
                        try {

                            while (tasks.size() == 0) {
                                tasks.wait();
                            }

                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    if (tasks.size() > 0)
                        task = tasks.removeFirst();
                }
                if (task != null) {
                    /** ignore code here */
                }
        }

    }
}
它起作用了


所以,我想知道为什么内部类方法不能同步外部类中的对象


希望得到详细的答案。

您只有同步的任务。什么代码不起作用?当我调用getInstance时,它的构造函数将被调用。5个线程都会调用run方法!如果同步有效,则只有一个线程可以获得监视器并执行代码。因此,我想知道为什么内部类方法无法同步外部类中的对象。。它可以。当您添加synchronized ThreadPool.this.if仅同步任务时,System.out.printlntasks的大小为:+tasks.size;这一行将执行5次一个线程一次?你可能真的在问,除了你正在写的同步,为什么你不能得到一些免费的额外同步?因为你没有。你得到你写的东西,没有更多。
synchronized (ThreadPool.this) {
 ...
}