使用继承使类线程安全

时间:2011-08-08 19:50:49

标签: java multithreading inheritance

假设我有这样一个类:

package com.spotonsystems.bulkadmin.cognosSDK.util.Logging;

public class RecordLogging implements LittleLogging{

    private LinkedList <String> logs;
    private boolean startNew;

    public RecordLogging() {
        logs = new LinkedList<String>();
    }

    public void log(String log) {
        logHelper(log);
        startNew = true;
    }

    public void logPart(String log) {
        logHelper(log);
        startNew = false;
    }

    private void logHelper(String log){
        // DO STUFF
    }

    public LinkedList<String> getResults() {
        return logs;
    }

}

现在假设我需要此代码的线程安全版本。我需要踏板安全版来实现LittleLogging。我希望线程安全副本具有与此类相同的行为,但我希望它是线程安全的。这样做是否安全:

package com.spotonsystems.bulkadmin.cognosSDK.util.Logging;

public class SyncRecordLogging extends RecordLogging {

    public SyncRecordLoging() {
        super();
    }

    public syncronized void log(String log) {
        super.log(log);
    }

    public syncronized void logPart(String log) {
        super.log(log);
    }

    public syncronized LinkedList<String> getResults() {
        return logs;
    }
}

奖金问题:我应该在哪里查找有关同步和线程的文档

1 个答案:

答案 0 :(得分:2)

您可以改用合成。另请注意,getResults会创建列表的副本:

public class SyncRecordLogging  implements LittleLogging{

    private final RecordLogging _log;

    public SyncRecordLogging() {
        _log = new RecordLogging();
    }

    public synchronized void log(String log) {
        _log.log(log);
    }

    public synchronized void logPart(String log) {
        _log.logPart(log);
    }

    public synchronized LinkedList<String> getResults() {
        // returning copy to avoid 'leaking' the enderlying reference
        return new LinkedList(_log.getResults());
    }
}

最佳阅读:Java Concurrency In Practice