< prev index next >

src/hotspot/share/runtime/objectMonitor.hpp

Print this page
rev 57560 : imported patch 8235795.patch.cr0

@@ -128,24 +128,28 @@
 
   // The sync code expects the header field to be at offset zero (0).
   // Enforced by the assert() in header_addr().
   volatile markWord _header;        // displaced object header word - mark
   void* volatile _object;           // backward object pointer - strong root
- public:
-  ObjectMonitor* _next_om;          // Next ObjectMonitor* linkage
  private:
   // Separate _header and _owner on different cache lines since both can
   // have busy multi-threaded access. _header and _object are set at
   // initial inflation and _object doesn't change until deflation so
   // _object is a good choice to share the cache line with _header.
-  // _next_om shares _header's cache line for pre-monitor list historical
-  // reasons. _next_om only changes if the next ObjectMonitor is deflated.
   DEFINE_PAD_MINUS_SIZE(0, DEFAULT_CACHE_LINE_SIZE,
-                        sizeof(volatile markWord) + sizeof(void* volatile) +
-                        sizeof(ObjectMonitor *));
+                        sizeof(volatile markWord) + sizeof(void* volatile));
   void* volatile _owner;            // pointer to owning thread OR BasicLock
   volatile jlong _previous_owner_tid;  // thread id of the previous owner of the monitor
+  // Separate _owner and _next_om on different cache lines since
+  // both can have busy multi-threaded access. _previous_owner_tid is only
+  // changed by ObjectMonitor::exit() so it is a good choice to share the
+  // cache line with _owner.
+  DEFINE_PAD_MINUS_SIZE(1, DEFAULT_CACHE_LINE_SIZE, sizeof(void* volatile) +
+                        sizeof(volatile jlong));
+ public:
+  ObjectMonitor* _next_om;          // Next ObjectMonitor* linkage
+ private:
   volatile intx _recursions;        // recursion count, 0 for first entry
   ObjectWaiter* volatile _EntryList;  // Threads blocked on entry or reentry.
                                       // The list is actually composed of WaitNodes,
                                       // acting as proxies for Threads.
 
< prev index next >