Új hozzászólás Aktív témák

  • thon73
    tag

    1) Bevett gyakorlat, hogy a lockhoz használt objektum egy mindentől független, kívülről nem látható, de belül se cserélhető (azaz final) tagváltozó legyen. Ezzel biztosítható, hogy csak ez az egy osztályod lockolhasson az általa védett dolgai körü
    l, külső kód véletlenül sem; és hogy nem cserélheted ki másik példányra egy mellényúlással. Vesd össze, ha mondjuk egy ArrayListre lockolsz és van egy gettered a listához, más is rálockolhat és bedeadlockolhatod a programot. Vagy adatok újratöltése után új ArrayListet hozol létre.

    Más jelentősége tudtommal nincs.

    2) Akkor eddig szerencséd volt, hogy az írás és a fájlhandle lezárása gyorsabban lement, minthogy ütközzenek... [link]

    Aha! Köszönöm. 1. pont alapján a kódot javítottam.

    2. Eddig multithreadet (a rendszer által kínált lehetőségeken kívül) csak időzítési feladatokra használtam. Viszont - a log szigorításával - szükségem lett volna egy "saját" log-ra, amit akkor is használhatok, ha tableten dolgozom. A program nagyon egyszerű, egy file-ba írja az üzeneteket. ((Az esetleges összeomlás miatt a metódus nyitja-írja-zárja a file-t (flush is lehetne helyette, de az idő nem volt lényeges szempont)). Ilyen üzenet bármelyik thread-ről érkezhet, ezért szeretnénk biztos lenni abban, hogy működik.

    Két megoldást találtam a figyelmeztetésed után:

    private final Object lock = new Object();

    private static String addTextToFileLog( File logFile, String text )
    {
    synchronized( lock )
    {
    OutputStreamWriter logStream = new OutputStreamWriter( new FileOutputStream(logFile, true));
    logStream.append( text );
    logStream.flush();
    logStream.close();
    }
    }

    illetve:

    private static synchronized String addTextToFileLog( File logFile, String text )
    {
    OutputStreamWriter logStream = new OutputStreamWriter( new FileOutputStream(logFile, true) );
    logStream.append( text );
    logStream.flush();
    logStream.close();
    }

    (A hibaellenőrzést az egyszerűség kedvéért töröltem.)
    Van előnye egyik vagy másik megközelítésnek? Egyáltalán jó ez így, vagy valamit elnéztem?
    Ha még abban tudnék egy kis segítséget kapni, hogy ezt hogyan tesztelhetem a szimpla próbálkozáson kívül, azt is megköszönném!

Új hozzászólás Aktív témák