检测同步函数java的并发访问

时间:2015-11-30 08:21:51

标签: java android multithreading concurrency

我在Android应用程序中有一个多线程环境。我使用单例类来存储数据。这个单例类包含一个使用synchronized方法访问的arraylist。

应用程序使用此arraylist在app中呈现图像。

初始问题:出现并发修改错误,所以我使get arraylist函数同步。

当前问题:并发修改错误未发生但返回空arraylist之间(可能存在并发访问时)。

目标:我想检测何时并发修改,以便返回空arraylist beeing而不是返回arraylist的最后状态。

  public synchronized List<FrameData> getCurrentDataToShow() {
        List<FrameData> lisCurrDataToShow = new ArrayList<FrameData>();
//        for (FrameData fd : listFrameData) {//concurrent modification exception
            //todo iterator test
            Iterator<FrameData> iterator = listFrameData.iterator();
            while (iterator.hasNext()) {
                FrameData fd = iterator.next();
            long currentTimeInMillis = java.lang.System.currentTimeMillis();

            if ((currentTimeInMillis > fd.getStartDate().getTime() && currentTimeInMillis < fd.getEndDate().getTime()) || (fd.isAllDay() && DateUtils.isToday(fd.getStartDate().getTime()))) {
                if (new File(ImageFrameActivity.ROOT_FOLDER_FILES + fd.getFileName()).exists()) {
                    lisCurrDataToShow.add(fd);
                }
            }
        }
        if (lisCurrDataToShow.size() == 0) { 
            lisCurrDataToShow.add(new FrameData(defaultFileName, null, null, null, String.valueOf(120), false));
        }
        return lisCurrDataToShow;
    }

请帮忙!

每次都很少发生此问题。

  • 如果一个线程正在访问getCurrentDataToShow()并且另一个线程试图访问此函数,那么该函数将返回什么?我是多线程的新手,请指导

0 个答案:

没有答案