`
liuInsect
  • 浏览: 133392 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

一种使用unsafe类修改变量值的方式

    博客分类:
  • java
阅读更多

本例子演示了另外一种修改变量值的方式,希望可以让读者从另外一个角度看待变量,欢迎大家讨论。

请看例子

 

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() );
	}

}

 

0
0
分享到:
评论

相关推荐

    一篇看懂Java中的Unsafe类

    2. **CAS(Compare and Swap)操作**:在并发编程中,`Unsafe`提供了原子性的CAS操作,通过内存偏移地址修改变量值。例如,`SynchronousQueue`中的`TransferStack`使用CAS更新栈顶节点。 ```java private static ...

    Java 多线程与并发(8-26)-JUC原子类- CAS, Unsafe和原子类详解.pdf

    CAS是一种无锁的同步机制,它使用一条CPU原子指令进行值的比较和更新。CAS操作需要三个参数:内存位置(V)、旧的预期值(A)和新值(B)。当且仅当内存位置的值与预期值相等时,才会将内存位置更新为新值,这个过程...

    golang利用unsafe操作未导出变量-Pointer使用详解

    通过以上的知识点展开,我们了解到在Go语言中,`unsafe`包提供了一种特殊的访问内存的手段,能够通过指针转换和算术操作直接访问和修改内存。但使用`unsafe`包需要谨慎,因为这可能引入难以发现的bug并降低代码的可...

    Java并发编程学习之Unsafe类与LockSupport类源码详析

    由于其强大的能力,Unsafe通常被视为一种“黑魔法”,不推荐在常规编程中使用,但在设计高性能并发组件时,它是不可或缺的工具。 1. `objectFieldOffset(Field field)`:返回给定字段在对象内存布局中的偏移量,...

    C#内存修改器最新源码

    在IT领域,内存修改器是一种工具,用于读取和修改应用程序的内存值,通常用于调试、游戏修改或者软件分析。本资源提供的是一个用C#编程语言编写的内存修改器的源代码,这对于理解C#如何操作内存以及游戏作弊软件的...

    C# 内存修改 ……

    C#是一种托管语言,由.NET框架提供自动内存管理,主要包括垃圾回收(Garbage Collection, GC)。这意味着开发者无需手动分配和释放内存,而是由运行时环境负责。然而,尽管如此,有时我们仍然需要对内存进行直接操作...

    golang-标准库(unsafe)

    在Go语言中,`unsafe`包提供了一种特殊的方式来绕过语言的一些安全限制,使得程序员可以直接操作内存。尽管这是不安全的,但在某些特定场景下,例如为了优化性能或实现某些底层操作,开发者可能需要使用这个包。`...

    04 并发编程专题01.zip

    这些类提供了一种在多线程环境下更新变量的方式,无需显式使用`synchronized`关键字或者`volatile`关键字。它们内部利用了硬件级别的原子操作,如CAS(Compare and Swap,比较并交换),能够在不锁定整个对象或数据...

    JAVA CAS深度分析

    JAVA CAS 深度分析 JAVA CAS(Compare And Swap)是一种原子操作,用于在多...5. AtomicInteger 等原子变量类:JAVA 中的 AtomicInteger 等原子变量类使用 CAS 操作来实现原子增量操作,例如 incrementAndGet() 方法。

    JAVA CAS实现原理与使用.docx

    Java并发编程中,CAS(Compare and Swap,比较并交换)是一种无锁算法,它提供了一种在多线程环境下更新共享变量的方式,避免了传统锁机制带来的诸多问题。在JDK 5之前,Java主要依赖`synchronized`关键字来保证线程...

    深入了解Java atomic原子类的使用方法和原理

    Java Atomic原子类的使用方法和原理 Java Atomic原子类是Java中的一种多...Java Atomic原子类提供了一种安全的方式来操作多线程环境下的变量,解决了多线程环境下的安全问题,使得开发者可以更方便地编写多线程程序。

    Programming_With_Objective-C

    Objective-C支持类别(Categories),这是一种扩展现有类的方式,使得开发者可以为类添加新的方法,无需修改原有类的代码。协议(Protocols)则定义了对象之间的消息传递契约,确保对象能够以一种可预测的方式进行...

    CAS底层原理与ABA问题.docx

    CAS(Compare And Swap)是一种基于硬件支持的无锁算法,它是乐观锁的一种实现方式,用于在多线程环境下实现对共享资源的原子性更新。在Java中,CAS操作主要通过`sun.misc.Unsafe`类来实现,这个类提供了对内存的...

    C#中使用指针

    ### 程序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 ...

    jdk-17windows版本

    - **密封类**:提供了一种控制其他类能否扩展或实现特定类或接口的方式,增强了类型安全。 - **记录类**:一种特殊的不可变、不可继承的类,用于表示数据记录。 - **线程局部变量清理**:自动清理不再使用的线程局部...

    计算机类面试试题大奉献

    结构是一种值类型,它直接存储在栈中或作为其他对象的一部分,而类是一种引用类型,存储的是指向堆上实际数据的引用。当一个结构被赋值时,其整个内容会被复制,因此改变一个副本不会影响到原始值。这使得结构适合于...

    1C#数据类型[归类].pdf

    dynamic类型允许在运行时确定变量的类型,提供了一种灵活的动态类型检查机制。string是特殊的引用类型,表示文本字符串,它是System.String类的别名,继承自object。 装箱和拆箱是值类型和引用类型之间转换的过程。...

    Java--CAS操作分析.txt_python怎么分析txt

    例如,`AtomicInteger`提供了一种线程安全的方式来更新整型变量。`AtomicInteger`内部使用`Unsafe`类的`compareAndSwapInt`方法实现CAS操作。这种方法避免了显式锁的使用,提高了性能。 #### 示例:AtomicInteger的...

    Java并发之无锁.docx

    Java并发之无锁是一种在多线程环境下避免加锁机制的优化策略,它基于乐观锁的概念,假设并发访问临界资源的线程间不会有冲突,从而提高程序的执行效率。在遇到冲突时,无锁通过一种称为Compare And Swap (CAS)的技术...

    C#及.Net经典面试题目及答案

    - **除了Session、Cookie和Application**: 可以使用服务器端跳转`this.Server.Transfer`或查询字符串`QueryString`来传递变量值。 #### 15\. C#中的索引器 - **实现**: 索引器允许使用索引符号`[]`来访问对象的...

Global site tag (gtag.js) - Google Analytics