本例子演示了另外一种修改变量值的方式,希望可以让读者从另外一个角度看待变量,欢迎大家讨论。
请看例子
package concurrentTest; import java.lang.reflect.Field; import sun.misc.Unsafe; /** * jdk 提供了一个unsafe类来直接通过 内存地址来操作变量 * 该例子演示了 另外一种变换 变量值的方式 * @Package concurrentTest * @author liukunyang * @date 2013-12-11 下午02:36:23 * @version V1.0 */ public class UnsafeTest { private int i; public int getI() { return i; } public void setI(int i) { this.i = i; } /** * @author liukunyang * @date 2013-3-20 * @param args * @throws NoSuchFieldException * @throws SecurityException */ public static void main(String[] args) throws SecurityException, NoSuchFieldException { // TODO Auto-generated method stub UnsafeTest ust = new UnsafeTest(); /** * 抛unsafe security异常,所以通过反射调用 * unsafe直接访问内存,所以不应在不受信用的类中访问 * public static Unsafe getUnsafe() { * Class cc = sun.reflect.Reflection.getCallerClass(2); * if (cc.getClassLoader() != null) * throw new SecurityException("Unsafe"); * return theUnsafe; * } * */ // Unsafe unsafe = Unsafe.getUnsafe(); Unsafe unsafe =null; try{ Class<?> clazz = Unsafe.class; Field f; f = clazz.getDeclaredField("theUnsafe"); f.setAccessible(true); unsafe = (Unsafe) f.get(clazz); } catch (IllegalAccessException e) { e.printStackTrace(); }catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } Long offfset = unsafe.objectFieldOffset(UnsafeTest.class.getDeclaredField("i")); unsafe.putInt(ust, offfset, 2);//修改掉i变量的值。 System.out.println( ust.getI() ); } }
相关推荐
2. **CAS(Compare and Swap)操作**:在并发编程中,`Unsafe`提供了原子性的CAS操作,通过内存偏移地址修改变量值。例如,`SynchronousQueue`中的`TransferStack`使用CAS更新栈顶节点。 ```java private static ...
CAS是一种无锁的同步机制,它使用一条CPU原子指令进行值的比较和更新。CAS操作需要三个参数:内存位置(V)、旧的预期值(A)和新值(B)。当且仅当内存位置的值与预期值相等时,才会将内存位置更新为新值,这个过程...
通过以上的知识点展开,我们了解到在Go语言中,`unsafe`包提供了一种特殊的访问内存的手段,能够通过指针转换和算术操作直接访问和修改内存。但使用`unsafe`包需要谨慎,因为这可能引入难以发现的bug并降低代码的可...
由于其强大的能力,Unsafe通常被视为一种“黑魔法”,不推荐在常规编程中使用,但在设计高性能并发组件时,它是不可或缺的工具。 1. `objectFieldOffset(Field field)`:返回给定字段在对象内存布局中的偏移量,...
在IT领域,内存修改器是一种工具,用于读取和修改应用程序的内存值,通常用于调试、游戏修改或者软件分析。本资源提供的是一个用C#编程语言编写的内存修改器的源代码,这对于理解C#如何操作内存以及游戏作弊软件的...
C#是一种托管语言,由.NET框架提供自动内存管理,主要包括垃圾回收(Garbage Collection, GC)。这意味着开发者无需手动分配和释放内存,而是由运行时环境负责。然而,尽管如此,有时我们仍然需要对内存进行直接操作...
在Go语言中,`unsafe`包提供了一种特殊的方式来绕过语言的一些安全限制,使得程序员可以直接操作内存。尽管这是不安全的,但在某些特定场景下,例如为了优化性能或实现某些底层操作,开发者可能需要使用这个包。`...
这些类提供了一种在多线程环境下更新变量的方式,无需显式使用`synchronized`关键字或者`volatile`关键字。它们内部利用了硬件级别的原子操作,如CAS(Compare and Swap,比较并交换),能够在不锁定整个对象或数据...
JAVA CAS 深度分析 JAVA CAS(Compare And Swap)是一种原子操作,用于在多...5. AtomicInteger 等原子变量类:JAVA 中的 AtomicInteger 等原子变量类使用 CAS 操作来实现原子增量操作,例如 incrementAndGet() 方法。
Java并发编程中,CAS(Compare and Swap,比较并交换)是一种无锁算法,它提供了一种在多线程环境下更新共享变量的方式,避免了传统锁机制带来的诸多问题。在JDK 5之前,Java主要依赖`synchronized`关键字来保证线程...
Java Atomic原子类的使用方法和原理 Java Atomic原子类是Java中的一种多...Java Atomic原子类提供了一种安全的方式来操作多线程环境下的变量,解决了多线程环境下的安全问题,使得开发者可以更方便地编写多线程程序。
Objective-C支持类别(Categories),这是一种扩展现有类的方式,使得开发者可以为类添加新的方法,无需修改原有类的代码。协议(Protocols)则定义了对象之间的消息传递契约,确保对象能够以一种可预测的方式进行...
CAS(Compare And Swap)是一种基于硬件支持的无锁算法,它是乐观锁的一种实现方式,用于在多线程环境下实现对共享资源的原子性更新。在Java中,CAS操作主要通过`sun.misc.Unsafe`类来实现,这个类提供了对内存的...
### 程序1:使用指针修改变量值 ```csharp using System; class nish { unsafe static void Increment(int* p) { // increment the int pointed to by p *p = *p + 1; } public static void Main() { int i ...
- **密封类**:提供了一种控制其他类能否扩展或实现特定类或接口的方式,增强了类型安全。 - **记录类**:一种特殊的不可变、不可继承的类,用于表示数据记录。 - **线程局部变量清理**:自动清理不再使用的线程局部...
结构是一种值类型,它直接存储在栈中或作为其他对象的一部分,而类是一种引用类型,存储的是指向堆上实际数据的引用。当一个结构被赋值时,其整个内容会被复制,因此改变一个副本不会影响到原始值。这使得结构适合于...
dynamic类型允许在运行时确定变量的类型,提供了一种灵活的动态类型检查机制。string是特殊的引用类型,表示文本字符串,它是System.String类的别名,继承自object。 装箱和拆箱是值类型和引用类型之间转换的过程。...
例如,`AtomicInteger`提供了一种线程安全的方式来更新整型变量。`AtomicInteger`内部使用`Unsafe`类的`compareAndSwapInt`方法实现CAS操作。这种方法避免了显式锁的使用,提高了性能。 #### 示例:AtomicInteger的...
Java并发之无锁是一种在多线程环境下避免加锁机制的优化策略,它基于乐观锁的概念,假设并发访问临界资源的线程间不会有冲突,从而提高程序的执行效率。在遇到冲突时,无锁通过一种称为Compare And Swap (CAS)的技术...
- **除了Session、Cookie和Application**: 可以使用服务器端跳转`this.Server.Transfer`或查询字符串`QueryString`来传递变量值。 #### 15\. C#中的索引器 - **实现**: 索引器允许使用索引符号`[]`来访问对象的...