equal
deleted
inserted
replaced
468 public NavigableSet<E> descendingSet() { |
468 public NavigableSet<E> descendingSet() { |
469 return new ConcurrentSkipListSet(m.descendingMap()); |
469 return new ConcurrentSkipListSet(m.descendingMap()); |
470 } |
470 } |
471 |
471 |
472 // Support for resetting map in clone |
472 // Support for resetting map in clone |
473 private static final Unsafe unsafe = Unsafe.getUnsafe(); |
473 private void setMap(ConcurrentNavigableMap<E,Object> map) { |
|
474 UNSAFE.putObjectVolatile(this, mapOffset, map); |
|
475 } |
|
476 |
|
477 private static final sun.misc.Unsafe UNSAFE; |
474 private static final long mapOffset; |
478 private static final long mapOffset; |
475 static { |
479 static { |
476 try { |
480 try { |
477 mapOffset = unsafe.objectFieldOffset |
481 UNSAFE = sun.misc.Unsafe.getUnsafe(); |
478 (ConcurrentSkipListSet.class.getDeclaredField("m")); |
482 Class k = ConcurrentSkipListSet.class; |
479 } catch (Exception ex) { throw new Error(ex); } |
483 mapOffset = UNSAFE.objectFieldOffset |
480 } |
484 (k.getDeclaredField("m")); |
481 private void setMap(ConcurrentNavigableMap<E,Object> map) { |
485 } catch (Exception e) { |
482 unsafe.putObjectVolatile(this, mapOffset, map); |
486 throw new Error(e); |
483 } |
487 } |
484 |
488 } |
485 } |
489 } |