Java 1.4 singleton containing a mutable field

Posted by Philippe on Stack Overflow See other posts from Stack Overflow or by Philippe
Published on 2010-03-16T16:42:37Z Indexed on 2010/03/16 16:51 UTC
Read the original article Hit count: 476

Filed under:
|
|

Hi, I'm working on a legacy Java 1.4 project, and I have a factory that instantiates a csv file parser as a singleton.

In my csv file parser, however, I have a HashSet that will store objects created from each line of my CSV file. All that will be used by a web application, and users will be uploading CSV files, possibly concurrently.

Now my question is : what is the best way to prevent my list of objects to be modified by 2 users ?

So far, I'm doing the following :

final class MyParser {
    private File csvFile = null;
    private static Set myObjects = Collections.synchronizedSet(new HashSet);

    public synchronized void setFile(File file) {
        this.csvFile = file;
    }

    public void parse()
        FileReader fr = null;
        try {
            fr = new FileReader(csvFile);
            synchronized(myObjects) {
                myObjects.clear();
                while(...) { // foreach line of my CSV, create a "MyObject"
                    myObjects.add(new MyObject(...));
                }
            }
        } catch (Exception e) {
          //...
        }
    }    
}    

Should I leave the lock only on the myObjects Set, or should I declare the whole parse() method as synchronized ?

Also, how should I synchronize - both - the setting of the csvFile and the parsing ? I feel like my actual design is broken because threads could modify the csv file several times while a possibly long parse process is running.

I hope I'm being clear enough, because myself am a bit confused on those multi-synchronization issues.

Thanks ;-)

© Stack Overflow or respective owner

Related posts about java

Related posts about concurrency