package com.alibaba.fastjson.util; import java.lang.ref.SoftReference; import java.nio.charset.CharsetDecoder; /** * @deprecated */ public class ThreadLocalCache { public final static int CHARS_CACH_INIT_SIZE = 1024; // 1k, 2^10; public final static int CHARS_CACH_INIT_SIZE_EXP = 10; public final static int CHARS_CACH_MAX_SIZE = 1024 * 128; // 128k, 2^17; public final static int CHARS_CACH_MAX_SIZE_EXP = 17; private final static ThreadLocal<SoftReference<char[]>> charsBufLocal = new ThreadLocal<SoftReference<char[]>>(); private final static ThreadLocal<CharsetDecoder> decoderLocal = new ThreadLocal<CharsetDecoder>(); public static CharsetDecoder getUTF8Decoder() { CharsetDecoder decoder = decoderLocal.get(); if (decoder == null) { decoder = new UTF8Decoder(); decoderLocal.set(decoder); } return decoder; } public static void clearChars() { charsBufLocal.set(null); } public static char[] getChars(int length) { SoftReference<char[]> ref = charsBufLocal.get(); if (ref == null) { return allocate(length); } char[] chars = ref.get(); if (chars == null) { return allocate(length); } if (chars.length < length) { chars = allocate(length); } return chars; } private static char[] allocate(int length) { if(length> CHARS_CACH_MAX_SIZE) { return new char[length]; } int allocateLength = getAllocateLengthExp(CHARS_CACH_INIT_SIZE_EXP, CHARS_CACH_MAX_SIZE_EXP, length); char[] chars = new char[allocateLength]; charsBufLocal.set(new SoftReference<char[]>(chars)); return chars; } private static int getAllocateLengthExp(int minExp, int maxExp, int length) { assert (1<<maxExp) >= length; // int max = 1 << maxExp; // if(length>= max) { // return length; // } int part = length >>> minExp; if(part <= 0) { return 1<< minExp; } return 1 << 32 - Integer.numberOfLeadingZeros(length-1); } // ///////// public final static int BYTES_CACH_INIT_SIZE = 1024; // 1k, 2^10; public final static int BYTES_CACH_INIT_SIZE_EXP = 10; public final static int BYTES_CACH_MAX_SIZE = 1024 * 128; // 128k, 2^17; public final static int BYTES_CACH_MAX_SIZE_EXP = 17; private final static ThreadLocal<SoftReference<byte[]>> bytesBufLocal = new ThreadLocal<SoftReference<byte[]>>(); public static void clearBytes() { bytesBufLocal.set(null); } public static byte[] getBytes(int length) { SoftReference<byte[]> ref = bytesBufLocal.get(); if (ref == null) { return allocateBytes(length); } byte[] bytes = ref.get(); if (bytes == null) { return allocateBytes(length); } if (bytes.length < length) { bytes = allocateBytes(length); } return bytes; } private static byte[] allocateBytes(int length) { if(length > BYTES_CACH_MAX_SIZE) { return new byte[length]; } int allocateLength = getAllocateLengthExp(BYTES_CACH_INIT_SIZE_EXP, BYTES_CACH_MAX_SIZE_EXP, length); byte[] chars = new byte[allocateLength]; bytesBufLocal.set(new SoftReference<byte[]>(chars)); return chars; } }