001
014
015 package com.liferay.portal.kernel.memory;
016
017 import com.liferay.portal.kernel.util.GetterUtil;
018 import com.liferay.portal.kernel.util.PropsKeys;
019 import com.liferay.portal.kernel.util.PropsUtil;
020
021 import java.lang.ref.Reference;
022 import java.lang.ref.ReferenceQueue;
023
024 import java.util.Map;
025 import java.util.concurrent.ConcurrentHashMap;
026
027
030 public class FinalizeManager {
031
032 public static final boolean THREAD_ENABLED = GetterUtil.getBoolean(
033 PropsUtil.get(PropsKeys.FINALIZE_MANAGER_THREAD_ENABLED));
034
035 public static <T> Reference<T> register(
036 T realReference, FinalizeAction finalizeAction) {
037
038 Reference<T> reference = new EqualityWeakReference<T>(
039 realReference, _referenceQueue);
040
041 _referenceActionMap.put(reference, finalizeAction);
042
043 if (!THREAD_ENABLED) {
044 _pollingCleanup();
045 }
046
047 return reference;
048 }
049
050 private static void _pollingCleanup() {
051 Reference<? extends Object> reference = null;
052
053 while ((reference = _referenceQueue.poll()) != null) {
054 FinalizeAction finalizeAction = _referenceActionMap.remove(
055 reference);
056
057 finalizeAction.doFinalize();
058 }
059 }
060
061 private static Map<Reference<?>, FinalizeAction> _referenceActionMap =
062 new ConcurrentHashMap<Reference<?>, FinalizeAction>();
063 private static ReferenceQueue<Object> _referenceQueue =
064 new ReferenceQueue<Object>();
065
066 private static class FinalizeThread extends Thread {
067
068 public FinalizeThread(String name) {
069 super(name);
070 }
071
072 @Override
073 public void run() {
074 while (true) {
075 try {
076 Reference<? extends Object> reference =
077 _referenceQueue.remove();
078
079 FinalizeAction finalizeAction = _referenceActionMap.remove(
080 reference);
081
082 finalizeAction.doFinalize();
083 }
084 catch (InterruptedException ie) {
085 }
086 }
087 }
088 }
089
090 static {
091 if (THREAD_ENABLED) {
092 Thread thread = new FinalizeThread("Finalize Thread");
093
094 thread.setDaemon(true);
095
096 thread.start();
097 }
098 }
099
100 }