Spring 의 원자 조작 Automaticy 조작
13526 단어 자바unsafeatomicboolean
/** Flag that indicates whether this context is currently active */
private final AtomicBoolean active = new AtomicBoolean();
/** Flag that indicates whether this context has been closed already */
private final AtomicBoolean closed = new AtomicBoolean();
이 active 와 closed 는 context 상 태 를 대표 합 니 다. 그 는 Atomic Boolean 으로 조작 합 니 다.
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package sun.misc;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.security.ProtectionDomain;
import sun.reflect.CallerSensitive;
import sun.reflect.Reflection;
public final class Unsafe {
private static final Unsafe theUnsafe;
public static final int INVALID_FIELD_OFFSET = -1;
public static final int ARRAY_BOOLEAN_BASE_OFFSET;
public static final int ARRAY_BYTE_BASE_OFFSET;
public static final int ARRAY_SHORT_BASE_OFFSET;
public static final int ARRAY_CHAR_BASE_OFFSET;
public static final int ARRAY_INT_BASE_OFFSET;
public static final int ARRAY_LONG_BASE_OFFSET;
public static final int ARRAY_FLOAT_BASE_OFFSET;
public static final int ARRAY_DOUBLE_BASE_OFFSET;
public static final int ARRAY_OBJECT_BASE_OFFSET;
public static final int ARRAY_BOOLEAN_INDEX_SCALE;
public static final int ARRAY_BYTE_INDEX_SCALE;
public static final int ARRAY_SHORT_INDEX_SCALE;
public static final int ARRAY_CHAR_INDEX_SCALE;
public static final int ARRAY_INT_INDEX_SCALE;
public static final int ARRAY_LONG_INDEX_SCALE;
public static final int ARRAY_FLOAT_INDEX_SCALE;
public static final int ARRAY_DOUBLE_INDEX_SCALE;
public static final int ARRAY_OBJECT_INDEX_SCALE;
public static final int ADDRESS_SIZE;
private static native void registerNatives();
private Unsafe() {
}
@CallerSensitive
public static Unsafe getUnsafe() {
Class var0 = Reflection.getCallerClass();
if(var0.getClassLoader() != null) {
throw new SecurityException("Unsafe");
} else {
return theUnsafe;
}
}
public native int getInt(Object var1, long var2);
public native void putInt(Object var1, long var2, int var4);
public native Object getObject(Object var1, long var2);
public native void putObject(Object var1, long var2, Object var4);
public native boolean getBoolean(Object var1, long var2);
public native void putBoolean(Object var1, long var2, boolean var4);
public native byte getByte(Object var1, long var2);
public native void putByte(Object var1, long var2, byte var4);
public native short getShort(Object var1, long var2);
public native void putShort(Object var1, long var2, short var4);
public native char getChar(Object var1, long var2);
public native void putChar(Object var1, long var2, char var4);
public native long getLong(Object var1, long var2);
public native void putLong(Object var1, long var2, long var4);
public native float getFloat(Object var1, long var2);
public native void putFloat(Object var1, long var2, float var4);
public native double getDouble(Object var1, long var2);
public native void putDouble(Object var1, long var2, double var4);
/** @deprecated */
@Deprecated
public int getInt(Object var1, int var2) {
return this.getInt(var1, (long)var2);
}
/** @deprecated */
@Deprecated
public void putInt(Object var1, int var2, int var3) {
this.putInt(var1, (long)var2, var3);
}
/** @deprecated */
@Deprecated
public Object getObject(Object var1, int var2) {
return this.getObject(var1, (long)var2);
}
/** @deprecated */
@Deprecated
public void putObject(Object var1, int var2, Object var3) {
this.putObject(var1, (long)var2, var3);
}
/** @deprecated */
@Deprecated
public boolean getBoolean(Object var1, int var2) {
return this.getBoolean(var1, (long)var2);
}
/** @deprecated */
@Deprecated
public void putBoolean(Object var1, int var2, boolean var3) {
this.putBoolean(var1, (long)var2, var3);
}
/** @deprecated */
@Deprecated
public byte getByte(Object var1, int var2) {
return this.getByte(var1, (long)var2);
}
/** @deprecated */
@Deprecated
public void putByte(Object var1, int var2, byte var3) {
this.putByte(var1, (long)var2, var3);
}
/** @deprecated */
@Deprecated
public short getShort(Object var1, int var2) {
return this.getShort(var1, (long)var2);
}
/** @deprecated */
@Deprecated
public void putShort(Object var1, int var2, short var3) {
this.putShort(var1, (long)var2, var3);
}
/** @deprecated */
@Deprecated
public char getChar(Object var1, int var2) {
return this.getChar(var1, (long)var2);
}
/** @deprecated */
@Deprecated
public void putChar(Object var1, int var2, char var3) {
this.putChar(var1, (long)var2, var3);
}
/** @deprecated */
@Deprecated
public long getLong(Object var1, int var2) {
return this.getLong(var1, (long)var2);
}
/** @deprecated */
@Deprecated
public void putLong(Object var1, int var2, long var3) {
this.putLong(var1, (long)var2, var3);
}
/** @deprecated */
@Deprecated
public float getFloat(Object var1, int var2) {
return this.getFloat(var1, (long)var2);
}
/** @deprecated */
@Deprecated
public void putFloat(Object var1, int var2, float var3) {
this.putFloat(var1, (long)var2, var3);
}
/** @deprecated */
@Deprecated
public double getDouble(Object var1, int var2) {
return this.getDouble(var1, (long)var2);
}
/** @deprecated */
@Deprecated
public void putDouble(Object var1, int var2, double var3) {
this.putDouble(var1, (long)var2, var3);
}
public native byte getByte(long var1);
public native void putByte(long var1, byte var3);
public native short getShort(long var1);
public native void putShort(long var1, short var3);
public native char getChar(long var1);
public native void putChar(long var1, char var3);
public native int getInt(long var1);
public native void putInt(long var1, int var3);
public native long getLong(long var1);
public native void putLong(long var1, long var3);
public native float getFloat(long var1);
public native void putFloat(long var1, float var3);
public native double getDouble(long var1);
public native void putDouble(long var1, double var3);
public native long getAddress(long var1);
public native void putAddress(long var1, long var3);
public native long allocateMemory(long var1);
public native long reallocateMemory(long var1, long var3);
public native void setMemory(Object var1, long var2, long var4, byte var6);
public void setMemory(long var1, long var3, byte var5) {
this.setMemory((Object)null, var1, var3, var5);
}
public native void copyMemory(Object var1, long var2, Object var4, long var5, long var7);
public void copyMemory(long var1, long var3, long var5) {
this.copyMemory((Object)null, var1, (Object)null, var3, var5);
}
public native void freeMemory(long var1);
/** @deprecated */
@Deprecated
public int fieldOffset(Field var1) {
return Modifier.isStatic(var1.getModifiers())?(int)this.staticFieldOffset(var1):(int)this.objectFieldOffset(var1);
}
/** @deprecated */
@Deprecated
public Object staticFieldBase(Class var1) {
Field[] var2 = var1.getDeclaredFields();
for(int var3 = 0; var3 < var2.length; ++var3) {
if(Modifier.isStatic(var2[var3].getModifiers())) {
return this.staticFieldBase(var2[var3]);
}
}
return null;
}
public native long staticFieldOffset(Field var1);
public native long objectFieldOffset(Field var1);
public native Object staticFieldBase(Field var1);
public native boolean shouldBeInitialized(Class<?> var1);
public native void ensureClassInitialized(Class var1);
public native int arrayBaseOffset(Class var1);
public native int arrayIndexScale(Class var1);
public native int addressSize();
public native int pageSize();
public native Class defineClass(String var1, byte[] var2, int var3, int var4, ClassLoader var5, ProtectionDomain var6);
/** @deprecated */
@Deprecated
@CallerSensitive
public native Class defineClass(String var1, byte[] var2, int var3, int var4);
public native Class defineAnonymousClass(Class var1, byte[] var2, Object[] var3);
public native Object allocateInstance(Class var1) throws InstantiationException;
public native void monitorEnter(Object var1);
public native void monitorExit(Object var1);
public native boolean tryMonitorEnter(Object var1);
public native void throwException(Throwable var1);
public final native boolean compareAndSwapObject(Object var1, long var2, Object var4, Object var5);
public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);
public final native boolean compareAndSwapLong(Object var1, long var2, long var4, long var6);
public native Object getObjectVolatile(Object var1, long var2);
public native void putObjectVolatile(Object var1, long var2, Object var4);
public native int getIntVolatile(Object var1, long var2);
public native void putIntVolatile(Object var1, long var2, int var4);
public native boolean getBooleanVolatile(Object var1, long var2);
public native void putBooleanVolatile(Object var1, long var2, boolean var4);
public native byte getByteVolatile(Object var1, long var2);
public native void putByteVolatile(Object var1, long var2, byte var4);
public native short getShortVolatile(Object var1, long var2);
public native void putShortVolatile(Object var1, long var2, short var4);
public native char getCharVolatile(Object var1, long var2);
public native void putCharVolatile(Object var1, long var2, char var4);
public native long getLongVolatile(Object var1, long var2);
public native void putLongVolatile(Object var1, long var2, long var4);
public native float getFloatVolatile(Object var1, long var2);
public native void putFloatVolatile(Object var1, long var2, float var4);
public native double getDoubleVolatile(Object var1, long var2);
public native void putDoubleVolatile(Object var1, long var2, double var4);
public native void putOrderedObject(Object var1, long var2, Object var4);
public native void putOrderedInt(Object var1, long var2, int var4);
public native void putOrderedLong(Object var1, long var2, long var4);
public native void unpark(Object var1);
public native void park(boolean var1, long var2);
public native int getLoadAverage(double[] var1, int var2);
static {
registerNatives();
Reflection.registerMethodsToFilter(Unsafe.class, new String[]{"getUnsafe"});
theUnsafe = new Unsafe();
ARRAY_BOOLEAN_BASE_OFFSET = theUnsafe.arrayBaseOffset(boolean[].class);
ARRAY_BYTE_BASE_OFFSET = theUnsafe.arrayBaseOffset(byte[].class);
ARRAY_SHORT_BASE_OFFSET = theUnsafe.arrayBaseOffset(short[].class);
ARRAY_CHAR_BASE_OFFSET = theUnsafe.arrayBaseOffset(char[].class);
ARRAY_INT_BASE_OFFSET = theUnsafe.arrayBaseOffset(int[].class);
ARRAY_LONG_BASE_OFFSET = theUnsafe.arrayBaseOffset(long[].class);
ARRAY_FLOAT_BASE_OFFSET = theUnsafe.arrayBaseOffset(float[].class);
ARRAY_DOUBLE_BASE_OFFSET = theUnsafe.arrayBaseOffset(double[].class);
ARRAY_OBJECT_BASE_OFFSET = theUnsafe.arrayBaseOffset(Object[].class);
ARRAY_BOOLEAN_INDEX_SCALE = theUnsafe.arrayIndexScale(boolean[].class);
ARRAY_BYTE_INDEX_SCALE = theUnsafe.arrayIndexScale(byte[].class);
ARRAY_SHORT_INDEX_SCALE = theUnsafe.arrayIndexScale(short[].class);
ARRAY_CHAR_INDEX_SCALE = theUnsafe.arrayIndexScale(char[].class);
ARRAY_INT_INDEX_SCALE = theUnsafe.arrayIndexScale(int[].class);
ARRAY_LONG_INDEX_SCALE = theUnsafe.arrayIndexScale(long[].class);
ARRAY_FLOAT_INDEX_SCALE = theUnsafe.arrayIndexScale(float[].class);
ARRAY_DOUBLE_INDEX_SCALE = theUnsafe.arrayIndexScale(double[].class);
ARRAY_OBJECT_INDEX_SCALE = theUnsafe.arrayIndexScale(Object[].class);
ADDRESS_SIZE = theUnsafe.addressSize();
}
}
이것 은 자바 의 로 컬 방법 류 입 니 다. 모두 jdk 바 텀 에서 대외 적 으로 메모리 조작 을 제공 하 는 클래스 입 니 다.
방법 대로
public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);
여기 서 예 를 들 어 compare AndSet 의 역할 을 설명 할 수 있 습 니 다. 예 를 들 어 병렬 계산 기 를 지원 합 니 다. 계산 을 할 때 현재 값 을 먼저 읽 고 가설 값 은 a 이 며 현재 값 + 1 에 b 를 얻 을 수 있 습 니 다. 그러나 + 1 작업 이 끝 난 후에 원래 값 을 b 로 직접 수정 할 수 없습니다. + 1 작업 을 하 는 과정 에서 다른 스 레 드 가 원래 값 을 수정 할 수 있 기 때 문 입 니 다.따라서 업데이트 하기 전에 원래 값 이 a 인지 아 닌 지 를 판단 해 야 합 니 다. a 와 같 지 않 으 면 다른 스 레 드 가 수정 되 었 음 을 설명 합 니 다. 원 치 를 다시 읽 고 조작 해 야 합 니 다. a 와 같 으 면 + 1 의 작업 과정 에서 다른 스 레 드 로 값 을 수정 하지 않 았 다 는 것 을 설명 합 니 다. 우 리 는 안심 하고 원 치 를 업데이트 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.