Perché System.Threading.Semaphore di C # implementa IDisposable e perché java.util.concurrent.Semaphore non implementa Closeable?

3

In .NET framework, System.Threading.Semaphore è un IDisposable che richiede il richiamo manuale di dispose . Tuttavia, in JavaSE, java.util.concurrent.Semaphore non è un Closeable né un AutoCloseable .

Perché scelgono un design API diverso? Qual è il migliore?

    
posta Yang Bo 16.10.2016 - 11:08
fonte

2 risposte

4

In Java, un Semaphore è implementato interamente in Java. Ciò significa che non ci sono risorse native da ripulire una volta che non è più necessario. Può essere ripulito come normali oggetti Java.

In Java, è necessario Closeable dove c'è una risorsa nativa che è associata all'oggetto Java su heap. per esempio. file Stream o socket. Queste risorse esterne sono più costose e limitate degli oggetti nell'heap e potrebbero esaurirsi molto tempo prima che un GC venga attivato e le abbia ripulite.

Nota: un GC non è sufficiente per ripulire queste risorse, anche il thread in background che li chiude deve essere eseguito per liberare tali risorse. In HotSpot / JVM c'è un thread di Finalizer che chiude queste risorse e se alcune sono lente a chiudersi può portare alla carenza di risorse.

    
risposta data 16.10.2016 - 12:06
fonte
1

Peter Lawrey lo ha spiegato abbastanza bene da una prospettiva Java, ma c'è un po 'di più in C # / Windows.

C'è un limite sul numero di gestisce che può essere aperto in una volta e mentre il Garbage Collector dovrebbe raccogliere Semaphore s ed eseguire i finalizzatori, che non è garantito . Gli handle vengono rilasciati al termine del processo, ma ciò potrebbe richiedere molto tempo.

Inoltre, i semafori possono essere utilizzati senza .NET . Sarebbe un po 'strano che C # non sia in grado di chiudere le maniglie quando C ++ può.

    
risposta data 23.08.2017 - 01:34
fonte

Leggi altre domande sui tag