Java, finalize, volatile

saveliev_a

Почему код

public class TestSomething
{
static volatile int currentAliveObjects;
static int maxAliveObjects;

public static void main( String[] args )
throws
InterruptedException
{
new TestSomething.testGarbageCollection;
}

private void testGarbageCollection
throws
InterruptedException
{
int i = 0;
while ( ++i > 0 )
{
new Storage( i );
if ( ++currentAliveObjects > maxAliveObjects )
{
maxAliveObjects = currentAliveObjects;
}
if ( i % 100000 == 0 )
{
System.out.println( "Collecting garbage..." );
System.gc;
Thread.sleep( 1000 );
System.out.println( currentAliveObjects + " / " + maxAliveObjects );
}
}
}

class Storage
{
int index;

Storage( int index )
{
this.index = index;
}

@Override
protected void finalize
{
--currentAliveObjects;
}
}
}

выдает отрицательные currentAliveObjects?

Collecting garbage...
-86 / 85172
Collecting garbage...
-112 / 87153
Collecting garbage...
-122 / 89639
Collecting garbage...
-86 / 89639
Collecting garbage...
-72 / 89639
Collecting garbage...
-109 / 89639
Collecting garbage...
-156 / 89639
Collecting garbage...
1 / 89639
Collecting garbage...
-30 / 89639
Collecting garbage...
45 / 91903
Collecting garbage...
107 / 91903
Collecting garbage...
201 / 91903
Collecting garbage...
288 / 91903
Collecting garbage...
259 / 91903
Collecting garbage...
319 / 91903

Разве volatile не должно хватать для решения проблемы с несколькими потоками? Я бы еще понял, если бы значение currentAliveObjects было иногда равно -1, когда после new Storage( i ); память может быть освобождена, а счетчик еще не увеличен.
UPD
Thread-Safe - volatile, synchronized & atomic

agaaaa

volatile не должно хватать. Ты должен использовать AtomicInteger
Вообще, не помешало бы подучить язык, а то потом спутники за 100млн. могут падать или в воздухе взрываться.

saveliev_a

За AtomicInteger спасибо.
Вторую (язвительную) часть поста может засунуть себе в жопу, потому что именно изучением я сейчас и занимаюсь.
Ну и для тех, кто еще наступит на грабли, ссылка на статью, в которой разъяснено, почему volatile недостаточно.

katrin2201

файналайзеры кстати плохо по перформансу - лучше PhantomReference (меньше напряг на GC)

saveliev_a

файналайзеры кстати плохо по перформансу - лучше PhantomReference (меньше напряг на GC)
Пасиб. Думаю, что пока мне они не пригодятся, было просто интересно с ними поиграться.

saveliev_a

Вспомнил, что раньше уже .

slonishka

FINALIZE @ VOLATILE

saveliev_a

:confused:
Оставить комментарий
Имя или ник:
Комментарий: