{"id":1936,"date":"2024-06-19T16:09:30","date_gmt":"2024-06-19T16:09:30","guid":{"rendered":"https:\/\/www.w3computing.com\/articles\/?p=1936"},"modified":"2024-06-19T16:09:36","modified_gmt":"2024-06-19T16:09:36","slug":"how-to-use-javas-unsafe-class-for-low-level-programming","status":"publish","type":"post","link":"https:\/\/www.w3computing.com\/articles\/how-to-use-javas-unsafe-class-for-low-level-programming\/","title":{"rendered":"How to Use Java&#8217;s Unsafe Class for Low-Level Programming"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Java is renowned for its safety and managed environment, with features like automatic memory management (garbage collection), bounds checking, and strong typing. However, there are times when you may need to bypass these safety features to achieve certain low-level tasks, such as memory manipulation, which are not directly supported by the standard Java API. This is where the <code>sun.misc.Unsafe<\/code> class comes into play. While it is a powerful tool, it should be used with caution due to the potential risks of causing JVM crashes, memory leaks, and other unstable behavior.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In this tutorial, we will explore the <code>Unsafe<\/code> class, understand its capabilities, and demonstrate its use for low-level programming tasks. The target audience for this tutorial is non-beginners who have a solid understanding of Java but want to delve into more advanced topics.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What is the Unsafe Class?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>sun.misc.Unsafe<\/code> class provides low-level operations that can be used for direct memory access, threading, and other system-level programming tasks. It is not part of the public Java API and is intended for use within the JVM itself and for advanced use cases where the standard Java API is insufficient.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Why Use Unsafe?<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Direct Memory Access<\/strong>: Manipulate memory directly, bypassing the JVM&#8217;s memory management.<\/li>\n\n\n\n<li><strong>Atomic Operations<\/strong>: Perform atomic operations on fields and arrays.<\/li>\n\n\n\n<li><strong>Low-Level Synchronization<\/strong>: Implement low-level synchronization mechanisms.<\/li>\n\n\n\n<li><strong>Performance Optimization<\/strong>: Optimize performance-critical code where traditional methods fall short.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Risks and Considerations<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Stability<\/strong>: Incorrect use can lead to JVM crashes.<\/li>\n\n\n\n<li><strong>Portability<\/strong>: Code may not be portable across different JVM implementations or versions.<\/li>\n\n\n\n<li><strong>Security<\/strong>: Can bypass Java&#8217;s security mechanisms, leading to potential vulnerabilities.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Accessing the Unsafe Class<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>Unsafe<\/code> class is not publicly accessible, and obtaining an instance of it requires reflection. Here is a method to get an instance of <code>Unsafe<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">import<\/span> sun.misc.Unsafe;\n\n<span class=\"hljs-keyword\">import<\/span> java.lang.reflect.Field;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">UnsafeAccess<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> Unsafe unsafe;\n\n    <span class=\"hljs-keyword\">static<\/span> {\n        <span class=\"hljs-keyword\">try<\/span> {\n            Field field = Unsafe<span class=\"hljs-class\">.<span class=\"hljs-keyword\">class<\/span>.<span class=\"hljs-title\">getDeclaredField<\/span>(\"<span class=\"hljs-title\">theUnsafe<\/span>\")<\/span>;\n            field.setAccessible(<span class=\"hljs-keyword\">true<\/span>);\n            unsafe = (Unsafe) field.get(<span class=\"hljs-keyword\">null<\/span>);\n        } <span class=\"hljs-keyword\">catch<\/span> (Exception e) {\n            <span class=\"hljs-keyword\">throw<\/span> <span class=\"hljs-keyword\">new<\/span> RuntimeException(<span class=\"hljs-string\">\"Unable to access Unsafe\"<\/span>, e);\n        }\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> Unsafe <span class=\"hljs-title\">getUnsafe<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> unsafe;\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">You can now use <code>UnsafeAccess.getUnsafe()<\/code> to obtain an instance of <code>Unsafe<\/code>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Direct Memory Access<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">One of the most powerful features of the <code>Unsafe<\/code> class is its ability to perform direct memory operations. This includes allocating, freeing, and accessing memory outside the Java heap.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Allocating Memory<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">To allocate memory, use the <code>allocateMemory<\/code> method, which takes a size in bytes and returns a memory address as a long value:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Unsafe unsafe = UnsafeAccess.getUnsafe();\n<span class=\"hljs-keyword\">long<\/span> memoryAddress = unsafe.allocateMemory(<span class=\"hljs-number\">100<\/span>); <span class=\"hljs-comment\">\/\/ Allocate 100 bytes<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Writing to Memory<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You can write to the allocated memory using methods like <code>putByte<\/code>, <code>putInt<\/code>, <code>putLong<\/code>, etc.:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">unsafe.putByte(memoryAddress, (<span class=\"hljs-keyword\">byte<\/span>) <span class=\"hljs-number\">10<\/span>);\nunsafe.putInt(memoryAddress + <span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">42<\/span>);\nunsafe.putLong(memoryAddress + <span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">123456789L<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Reading from Memory<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Similarly, you can read from the allocated memory using methods like <code>getByte<\/code>, <code>getInt<\/code>, <code>getLong<\/code>, etc.:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">byte<\/span> byteValue = unsafe.getByte(memoryAddress);\n<span class=\"hljs-keyword\">int<\/span> intValue = unsafe.getInt(memoryAddress + <span class=\"hljs-number\">1<\/span>);\n<span class=\"hljs-keyword\">long<\/span> longValue = unsafe.getLong(memoryAddress + <span class=\"hljs-number\">5<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Freeing Memory<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">To free the allocated memory, use the <code>freeMemory<\/code> method:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">unsafe.freeMemory(memoryAddress);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Example: Direct Memory Access<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Here is a complete example demonstrating direct memory access:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">DirectMemoryExample<\/span> <\/span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#91;] args)<\/span> <\/span>{\n        Unsafe unsafe = UnsafeAccess.getUnsafe();\n\n        <span class=\"hljs-comment\">\/\/ Allocate memory<\/span>\n        <span class=\"hljs-keyword\">long<\/span> memoryAddress = unsafe.allocateMemory(<span class=\"hljs-number\">16<\/span>);\n\n        <span class=\"hljs-keyword\">try<\/span> {\n            <span class=\"hljs-comment\">\/\/ Write values to memory<\/span>\n            unsafe.putByte(memoryAddress, (<span class=\"hljs-keyword\">byte<\/span>) <span class=\"hljs-number\">1<\/span>);\n            unsafe.putInt(memoryAddress + <span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">42<\/span>);\n            unsafe.putLong(memoryAddress + <span class=\"hljs-number\">5<\/span>, <span class=\"hljs-number\">123456789L<\/span>);\n\n            <span class=\"hljs-comment\">\/\/ Read values from memory<\/span>\n            <span class=\"hljs-keyword\">byte<\/span> byteValue = unsafe.getByte(memoryAddress);\n            <span class=\"hljs-keyword\">int<\/span> intValue = unsafe.getInt(memoryAddress + <span class=\"hljs-number\">1<\/span>);\n            <span class=\"hljs-keyword\">long<\/span> longValue = unsafe.getLong(memoryAddress + <span class=\"hljs-number\">5<\/span>);\n\n            System.out.println(<span class=\"hljs-string\">\"Byte value: \"<\/span> + byteValue);\n            System.out.println(<span class=\"hljs-string\">\"Int value: \"<\/span> + intValue);\n            System.out.println(<span class=\"hljs-string\">\"Long value: \"<\/span> + longValue);\n        } <span class=\"hljs-keyword\">finally<\/span> {\n            <span class=\"hljs-comment\">\/\/ Free memory<\/span>\n            unsafe.freeMemory(memoryAddress);\n        }\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Atomic Operations<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>Unsafe<\/code> class provides methods for performing atomic operations on fields and array elements. This is useful for implementing lock-free data structures and algorithms.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Atomic Field Updates<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">To perform atomic updates on fields, use methods like <code>compareAndSwapInt<\/code>, <code>compareAndSwapLong<\/code>, and <code>compareAndSwapObject<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">First, obtain the field offset:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Field field = MyClass<span class=\"hljs-class\">.<span class=\"hljs-keyword\">class<\/span>.<span class=\"hljs-title\">getDeclaredField<\/span>(\"<span class=\"hljs-title\">value<\/span>\")<\/span>;\n<span class=\"hljs-keyword\">long<\/span> fieldOffset = unsafe.objectFieldOffset(field);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Then, perform atomic updates:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">MyClass obj = <span class=\"hljs-keyword\">new<\/span> MyClass();\n<span class=\"hljs-keyword\">boolean<\/span> success = unsafe.compareAndSwapInt(obj, fieldOffset, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">42<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Atomic Array Updates<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">To perform atomic updates on array elements, use methods like <code>compareAndSwapInt<\/code>, <code>compareAndSwapLong<\/code>, and <code>compareAndSwapObject<\/code> with array base and index scale:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">int<\/span>&#91;] array = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-keyword\">int<\/span>&#91;<span class=\"hljs-number\">10<\/span>];\n<span class=\"hljs-keyword\">long<\/span> arrayBase = unsafe.arrayBaseOffset(<span class=\"hljs-keyword\">int<\/span>&#91;]<span class=\"hljs-class\">.<span class=\"hljs-keyword\">class<\/span>)<\/span>;\n<span class=\"hljs-keyword\">long<\/span> arrayIndexScale = unsafe.arrayIndexScale(<span class=\"hljs-keyword\">int<\/span>&#91;]<span class=\"hljs-class\">.<span class=\"hljs-keyword\">class<\/span>)<\/span>;\n\n<span class=\"hljs-keyword\">int<\/span> index = <span class=\"hljs-number\">2<\/span>;\n<span class=\"hljs-keyword\">long<\/span> offset = arrayBase + index * arrayIndexScale;\n<span class=\"hljs-keyword\">boolean<\/span> success = unsafe.compareAndSwapInt(array, offset, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">42<\/span>);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Example: Atomic Operations<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Here is a complete example demonstrating atomic operations:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MyClass<\/span> <\/span>{\n    <span class=\"hljs-keyword\">volatile<\/span> <span class=\"hljs-keyword\">int<\/span> value;\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">AtomicOperationsExample<\/span> <\/span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#91;] args)<\/span> <span class=\"hljs-keyword\">throws<\/span> NoSuchFieldException <\/span>{\n        Unsafe unsafe = UnsafeAccess.getUnsafe();\n\n        <span class=\"hljs-comment\">\/\/ Atomic field update<\/span>\n        MyClass obj = <span class=\"hljs-keyword\">new<\/span> MyClass();\n        Field field = MyClass<span class=\"hljs-class\">.<span class=\"hljs-keyword\">class<\/span>.<span class=\"hljs-title\">getDeclaredField<\/span>(\"<span class=\"hljs-title\">value<\/span>\")<\/span>;\n        <span class=\"hljs-keyword\">long<\/span> fieldOffset = unsafe.objectFieldOffset(field);\n        <span class=\"hljs-keyword\">boolean<\/span> fieldSuccess = unsafe.compareAndSwapInt(obj, fieldOffset, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">42<\/span>);\n        System.out.println(<span class=\"hljs-string\">\"Field update success: \"<\/span> + fieldSuccess);\n        System.out.println(<span class=\"hljs-string\">\"Updated value: \"<\/span> + obj.value);\n\n        <span class=\"hljs-comment\">\/\/ Atomic array update<\/span>\n        <span class=\"hljs-keyword\">int<\/span>&#91;] array = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-keyword\">int<\/span>&#91;<span class=\"hljs-number\">10<\/span>];\n        <span class=\"hljs-keyword\">long<\/span> arrayBase = unsafe.arrayBaseOffset(<span class=\"hljs-keyword\">int<\/span>&#91;]<span class=\"hljs-class\">.<span class=\"hljs-keyword\">class<\/span>)<\/span>;\n        <span class=\"hljs-keyword\">long<\/span> arrayIndexScale = unsafe.arrayIndexScale(<span class=\"hljs-keyword\">int<\/span>&#91;]<span class=\"hljs-class\">.<span class=\"hljs-keyword\">class<\/span>)<\/span>;\n        <span class=\"hljs-keyword\">int<\/span> index = <span class=\"hljs-number\">2<\/span>;\n        <span class=\"hljs-keyword\">long<\/span> offset = arrayBase + index * arrayIndexScale;\n        <span class=\"hljs-keyword\">boolean<\/span> arraySuccess = unsafe.compareAndSwapInt(array, offset, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">42<\/span>);\n        System.out.println(<span class=\"hljs-string\">\"Array update success: \"<\/span> + arraySuccess);\n        System.out.println(<span class=\"hljs-string\">\"Updated array value: \"<\/span> + array&#91;index]);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Low-Level Synchronization<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>Unsafe<\/code> class provides methods for low-level synchronization, such as creating and manipulating locks and barriers.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Park and Unpark<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>park<\/code> and <code>unpark<\/code> methods provide low-level thread blocking and unblocking mechanisms:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Thread thread = <span class=\"hljs-keyword\">new<\/span> Thread(() -&gt; {\n    System.out.println(<span class=\"hljs-string\">\"Thread will park\"<\/span>);\n    unsafe.park(<span class=\"hljs-keyword\">false<\/span>, <span class=\"hljs-number\">0<\/span>);\n    System.out.println(<span class=\"hljs-string\">\"Thread unparked\"<\/span>);\n});\nthread.start();\n\nThread.sleep(<span class=\"hljs-number\">1000<\/span>);\nSystem.out.println(<span class=\"hljs-string\">\"Unparking thread\"<\/span>);\nunsafe.unpark(thread);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Monitor Enter and Exit<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>monitorEnter<\/code> and <code>monitorExit<\/code> methods allow you to manually acquire and release object monitors:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\">Object lock = <span class=\"hljs-keyword\">new<\/span> Object();\nunsafe.monitorEnter(lock);\n<span class=\"hljs-keyword\">try<\/span> {\n    <span class=\"hljs-comment\">\/\/ Critical section<\/span>\n} <span class=\"hljs-keyword\">finally<\/span> {\n    unsafe.monitorExit(lock);\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Example: Low-Level Synchronization<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Here is a complete example demonstrating low-level synchronization:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">LowLevelSynchronizationExample<\/span> <\/span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#91;] args)<\/span> <span class=\"hljs-keyword\">throws<\/span> InterruptedException <\/span>{\n        Unsafe unsafe = UnsafeAccess.getUnsafe();\n\n        <span class=\"hljs-comment\">\/\/ Park and unpark<\/span>\n        Thread thread = <span class=\"hljs-keyword\">new<\/span> Thread(() -&gt; {\n            System.out.println(<span class=\"hljs-string\">\"Thread will park\"<\/span>);\n            unsafe.park(<span class=\"hljs-keyword\">false<\/span>, <span class=\"hljs-number\">0<\/span>);\n            System.out.println(<span class=\"hljs-string\">\"Thread unparked\"<\/span>);\n        });\n        thread.start();\n\n        Thread.sleep(<span class=\"hljs-number\">1000<\/span>);\n        System.out.println(<span class=\"hljs-string\">\"Unparking thread\"<\/span>);\n        unsafe.unpark(thread);\n\n        <span class=\"hljs-comment\">\/\/ Monitor enter and exit<\/span>\n        Object lock = <span class=\"hljs-keyword\">new<\/span> Object();\n        unsafe.monitorEnter(lock);\n        <span class=\"hljs-keyword\">try<\/span> {\n            System.out.println(<span class=\"hljs-string\">\"Entered monitor\"<\/span>);\n        } <span class=\"hljs-keyword\">finally<\/span> {\n            unsafe.monitorExit(lock);\n            System.out.println(<span class=\"hljs-string\">\"Exited monitor\"<\/span>);\n        }\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Memory Barriers<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Memory barriers are crucial in concurrent programming for ensuring proper ordering of memory operations. The <code>Unsafe<\/code> class provides methods for inserting memory barriers.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Store and Load Fences<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>storeFence()<\/code>: Ensures that all previous writes are visible before any subsequent writes.<\/li>\n\n\n\n<li><code>loadFence()<\/code>: Ensures that all previous reads are visible before any subsequent reads.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Example: Memory Barriers<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Here is a complete example demonstrating memory barriers:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MemoryBarriersExample<\/span> <\/span>{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#91;] args)<\/span> <\/span>{\n        Unsafe unsafe = UnsafeAccess.getUnsafe();\n\n        <span class=\"hljs-comment\">\/\/ Store fence<\/span>\n        unsafe.storeFence();\n        System.out.println(<span class=\"hljs-string\">\"Store fence executed\"<\/span>);\n\n        <span class=\"hljs-comment\">\/\/ Load<\/span>\n\n fence\n        unsafe.loadFence();\n        System.out.println(<span class=\"hljs-string\">\"Load fence executed\"<\/span>);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Off-Heap Data Structures<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">With direct memory access, you can implement off-heap data structures that are not subject to garbage collection, providing performance benefits in certain scenarios.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Example: Off-Heap Array<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Here is an example of implementing an off-heap integer array:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">OffHeapArray<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">final<\/span> <span class=\"hljs-keyword\">long<\/span> size;\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">final<\/span> <span class=\"hljs-keyword\">long<\/span> address;\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">final<\/span> Unsafe unsafe;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">OffHeapArray<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">long<\/span> size)<\/span> <\/span>{\n        <span class=\"hljs-keyword\">this<\/span>.size = size;\n        <span class=\"hljs-keyword\">this<\/span>.unsafe = UnsafeAccess.getUnsafe();\n        <span class=\"hljs-keyword\">this<\/span>.address = unsafe.allocateMemory(size * Integer.BYTES);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">set<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">long<\/span> index, <span class=\"hljs-keyword\">int<\/span> value)<\/span> <\/span>{\n        unsafe.putInt(address + index * Integer.BYTES, value);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">get<\/span><span class=\"hljs-params\">(<span class=\"hljs-keyword\">long<\/span> index)<\/span> <\/span>{\n        <span class=\"hljs-keyword\">return<\/span> unsafe.getInt(address + index * Integer.BYTES);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">free<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n        unsafe.freeMemory(address);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#91;] args)<\/span> <\/span>{\n        OffHeapArray array = <span class=\"hljs-keyword\">new<\/span> OffHeapArray(<span class=\"hljs-number\">10<\/span>);\n        array.set(<span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">42<\/span>);\n        array.set(<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">84<\/span>);\n\n        System.out.println(<span class=\"hljs-string\">\"Array&#91;0]: \"<\/span> + array.get(<span class=\"hljs-number\">0<\/span>));\n        System.out.println(<span class=\"hljs-string\">\"Array&#91;1]: \"<\/span> + array.get(<span class=\"hljs-number\">1<\/span>));\n\n        array.free();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>Unsafe<\/code> class in Java provides a powerful set of tools for low-level programming, enabling direct memory access, atomic operations, low-level synchronization, memory barriers, and more. However, it comes with significant risks and should be used with caution. Proper understanding and careful handling are essential to avoid potential pitfalls such as JVM crashes, memory leaks, and security vulnerabilities.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This tutorial covered the basics of accessing and using the <code>Unsafe<\/code> class, demonstrating its capabilities through practical examples. While <code>Unsafe<\/code> can be a valuable tool in certain scenarios, always consider whether it is truly necessary for your use case and whether safer alternatives are available.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Java is renowned for its safety and managed environment, with features like automatic memory management (garbage collection), bounds checking, and strong typing. However, there are times when you may need to bypass these safety features to achieve certain low-level tasks, such as memory manipulation, which are not directly supported by the standard Java API. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[5,4],"tags":[],"class_list":["post-1936","post","type-post","status-publish","format-standard","category-java","category-programming-languages","entry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How to Use Java&#039;s Unsafe Class for Low-Level Programming<\/title>\n<meta name=\"description\" content=\"The sun.misc.Unsafe class is a powerful tool, it should be used with caution due to the potential risks of causing JVM crashes, memory leaks\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.w3computing.com\/articles\/how-to-use-javas-unsafe-class-for-low-level-programming\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Use Java&#039;s Unsafe Class for Low-Level Programming\" \/>\n<meta property=\"og:description\" content=\"The sun.misc.Unsafe class is a powerful tool, it should be used with caution due to the potential risks of causing JVM crashes, memory leaks\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.w3computing.com\/articles\/how-to-use-javas-unsafe-class-for-low-level-programming\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-06-19T16:09:30+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-06-19T16:09:36+00:00\" \/>\n<meta name=\"author\" content=\"w3compadmin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"w3compadmin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"TechArticle\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-use-javas-unsafe-class-for-low-level-programming\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-use-javas-unsafe-class-for-low-level-programming\\\/\"},\"author\":{\"name\":\"w3compadmin\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\"},\"headline\":\"How to Use Java&#8217;s Unsafe Class for Low-Level Programming\",\"datePublished\":\"2024-06-19T16:09:30+00:00\",\"dateModified\":\"2024-06-19T16:09:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-use-javas-unsafe-class-for-low-level-programming\\\/\"},\"wordCount\":748,\"articleSection\":[\"Java\",\"Programming Languages\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-use-javas-unsafe-class-for-low-level-programming\\\/\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-use-javas-unsafe-class-for-low-level-programming\\\/\",\"name\":\"How to Use Java's Unsafe Class for Low-Level Programming\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#website\"},\"datePublished\":\"2024-06-19T16:09:30+00:00\",\"dateModified\":\"2024-06-19T16:09:36+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\"},\"description\":\"The sun.misc.Unsafe class is a powerful tool, it should be used with caution due to the potential risks of causing JVM crashes, memory leaks\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-use-javas-unsafe-class-for-low-level-programming\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-use-javas-unsafe-class-for-low-level-programming\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/how-to-use-javas-unsafe-class-for-low-level-programming\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Articles Home\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Programming Languages\",\"item\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/programming-languages\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"How to Use Java&#8217;s Unsafe Class for Low-Level Programming\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#website\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/\",\"name\":\"Developer Articles Hub\",\"description\":\"\",\"alternateName\":\"Developer Articles\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/#\\\/schema\\\/person\\\/a550b3e20d78bb4f79b7c6b7b53f0561\",\"name\":\"w3compadmin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"url\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"contentUrl\":\"https:\\\/\\\/www.w3computing.com\\\/articles\\\/wp-content\\\/litespeed\\\/avatar\\\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266\",\"caption\":\"w3compadmin\"},\"sameAs\":[\"http:\\\/\\\/w3computing.com\\\/articles\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Use Java's Unsafe Class for Low-Level Programming","description":"The sun.misc.Unsafe class is a powerful tool, it should be used with caution due to the potential risks of causing JVM crashes, memory leaks","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.w3computing.com\/articles\/how-to-use-javas-unsafe-class-for-low-level-programming\/","og_locale":"en_US","og_type":"article","og_title":"How to Use Java's Unsafe Class for Low-Level Programming","og_description":"The sun.misc.Unsafe class is a powerful tool, it should be used with caution due to the potential risks of causing JVM crashes, memory leaks","og_url":"https:\/\/www.w3computing.com\/articles\/how-to-use-javas-unsafe-class-for-low-level-programming\/","article_published_time":"2024-06-19T16:09:30+00:00","article_modified_time":"2024-06-19T16:09:36+00:00","author":"w3compadmin","twitter_card":"summary_large_image","twitter_misc":{"Written by":"w3compadmin","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"TechArticle","@id":"https:\/\/www.w3computing.com\/articles\/how-to-use-javas-unsafe-class-for-low-level-programming\/#article","isPartOf":{"@id":"https:\/\/www.w3computing.com\/articles\/how-to-use-javas-unsafe-class-for-low-level-programming\/"},"author":{"name":"w3compadmin","@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561"},"headline":"How to Use Java&#8217;s Unsafe Class for Low-Level Programming","datePublished":"2024-06-19T16:09:30+00:00","dateModified":"2024-06-19T16:09:36+00:00","mainEntityOfPage":{"@id":"https:\/\/www.w3computing.com\/articles\/how-to-use-javas-unsafe-class-for-low-level-programming\/"},"wordCount":748,"articleSection":["Java","Programming Languages"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.w3computing.com\/articles\/how-to-use-javas-unsafe-class-for-low-level-programming\/","url":"https:\/\/www.w3computing.com\/articles\/how-to-use-javas-unsafe-class-for-low-level-programming\/","name":"How to Use Java's Unsafe Class for Low-Level Programming","isPartOf":{"@id":"https:\/\/www.w3computing.com\/articles\/#website"},"datePublished":"2024-06-19T16:09:30+00:00","dateModified":"2024-06-19T16:09:36+00:00","author":{"@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561"},"description":"The sun.misc.Unsafe class is a powerful tool, it should be used with caution due to the potential risks of causing JVM crashes, memory leaks","breadcrumb":{"@id":"https:\/\/www.w3computing.com\/articles\/how-to-use-javas-unsafe-class-for-low-level-programming\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.w3computing.com\/articles\/how-to-use-javas-unsafe-class-for-low-level-programming\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.w3computing.com\/articles\/how-to-use-javas-unsafe-class-for-low-level-programming\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Articles Home","item":"https:\/\/www.w3computing.com\/articles\/"},{"@type":"ListItem","position":2,"name":"Programming Languages","item":"https:\/\/www.w3computing.com\/articles\/programming-languages\/"},{"@type":"ListItem","position":3,"name":"How to Use Java&#8217;s Unsafe Class for Low-Level Programming"}]},{"@type":"WebSite","@id":"https:\/\/www.w3computing.com\/articles\/#website","url":"https:\/\/www.w3computing.com\/articles\/","name":"Developer Articles Hub","description":"","alternateName":"Developer Articles","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.w3computing.com\/articles\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.w3computing.com\/articles\/#\/schema\/person\/a550b3e20d78bb4f79b7c6b7b53f0561","name":"w3compadmin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","url":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","contentUrl":"https:\/\/www.w3computing.com\/articles\/wp-content\/litespeed\/avatar\/bd481d404e42caa2763662a3bfe825f8.jpg?ver=1780141266","caption":"w3compadmin"},"sameAs":["http:\/\/w3computing.com\/articles"]}]}},"featured_image_src":null,"featured_image_src_square":null,"author_info":{"display_name":"w3compadmin","author_link":"https:\/\/www.w3computing.com\/articles\/author\/w3compadmin\/"},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/1936","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/comments?post=1936"}],"version-history":[{"count":2,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/1936\/revisions"}],"predecessor-version":[{"id":1938,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/posts\/1936\/revisions\/1938"}],"wp:attachment":[{"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/media?parent=1936"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/categories?post=1936"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.w3computing.com\/articles\/wp-json\/wp\/v2\/tags?post=1936"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}