Coverage Summary for Class: Synchronized (com.google.common.collect)
| Class | Method, % | Line, % |
|---|---|---|
| Synchronized | 0% (0/24) | 0% (0/48) |
| Synchronized$SynchronizedAsMap | 0% (0/5) | 0% (0/16) |
| Synchronized$SynchronizedAsMapEntries | 0% (0/10) | 0% (0/29) |
| Synchronized$SynchronizedAsMapEntries$1 | 0% (0/2) | 0% (0/2) |
| Synchronized$SynchronizedAsMapEntries$1$1 | 0% (0/3) | 0% (0/3) |
| Synchronized$SynchronizedAsMapValues | 0% (0/2) | 0% (0/2) |
| Synchronized$SynchronizedAsMapValues$1 | 0% (0/2) | 0% (0/2) |
| Synchronized$SynchronizedBiMap | 0% (0/6) | 0% (0/17) |
| Synchronized$SynchronizedCollection | 0% (0/21) | 0% (0/55) |
| Synchronized$SynchronizedDeque | 0% (0/19) | 0% (0/53) |
| Synchronized$SynchronizedEntry | 0% (0/7) | 0% (0/17) |
| Synchronized$SynchronizedList | 0% (0/16) | 0% (0/42) |
| Synchronized$SynchronizedListMultimap | 0% (0/5) | 0% (0/11) |
| Synchronized$SynchronizedMap | 0% (0/27) | 0% (0/85) |
| Synchronized$SynchronizedMultimap | 0% (0/23) | 0% (0/77) |
| Synchronized$SynchronizedMultiset | 0% (0/11) | 0% (0/35) |
| Synchronized$SynchronizedNavigableMap | 0% (0/24) | 0% (0/66) |
| Synchronized$SynchronizedNavigableSet | 0% (0/16) | 0% (0/41) |
| Synchronized$SynchronizedObject | 0% (0/4) | 0% (0/10) |
| Synchronized$SynchronizedQueue | 0% (0/7) | 0% (0/17) |
| Synchronized$SynchronizedRandomAccessList | 0% (0/1) | 0% (0/1) |
| Synchronized$SynchronizedSet | 0% (0/4) | 0% (0/10) |
| Synchronized$SynchronizedSetMultimap | 0% (0/6) | 0% (0/16) |
| Synchronized$SynchronizedSortedMap | 0% (0/8) | 0% (0/20) |
| Synchronized$SynchronizedSortedSet | 0% (0/8) | 0% (0/20) |
| Synchronized$SynchronizedSortedSetMultimap | 0% (0/6) | 0% (0/14) |
| Synchronized$SynchronizedTable | 0% (0/23) | 0% (0/71) |
| Synchronized$SynchronizedTable$1 | 0% (0/2) | 0% (0/2) |
| Synchronized$SynchronizedTable$2 | 0% (0/2) | 0% (0/2) |
| Total | 0% (0/294) | 0% (0/784) |
1 /* 2 * Copyright (C) 2007 The Guava Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.google.common.collect; 18 19 import static com.google.common.base.Preconditions.checkNotNull; 20 21 import com.google.common.annotations.GwtCompatible; 22 import com.google.common.annotations.GwtIncompatible; 23 import com.google.common.annotations.VisibleForTesting; 24 import com.google.j2objc.annotations.RetainedWith; 25 import java.io.IOException; 26 import java.io.ObjectOutputStream; 27 import java.io.Serializable; 28 import java.util.Collection; 29 import java.util.Comparator; 30 import java.util.Deque; 31 import java.util.Iterator; 32 import java.util.List; 33 import java.util.ListIterator; 34 import java.util.Map; 35 import java.util.Map.Entry; 36 import java.util.NavigableMap; 37 import java.util.NavigableSet; 38 import java.util.Queue; 39 import java.util.RandomAccess; 40 import java.util.Set; 41 import java.util.SortedMap; 42 import java.util.SortedSet; 43 import java.util.Spliterator; 44 import java.util.function.BiConsumer; 45 import java.util.function.BiFunction; 46 import java.util.function.Consumer; 47 import java.util.function.Function; 48 import java.util.function.Predicate; 49 import java.util.function.UnaryOperator; 50 import java.util.stream.Stream; 51 import org.checkerframework.checker.nullness.qual.Nullable; 52 53 /** 54 * Synchronized collection views. The returned synchronized collection views are serializable if the 55 * backing collection and the mutex are serializable. 56 * 57 * <p>If {@code null} is passed as the {@code mutex} parameter to any of this class's top-level 58 * methods or inner class constructors, the created object uses itself as the synchronization mutex. 59 * 60 * <p>This class should be used by other collection classes only. 61 * 62 * @author Mike Bostock 63 * @author Jared Levy 64 */ 65 @GwtCompatible(emulated = true) 66 final class Synchronized { 67 private Synchronized() {} 68 69 static class SynchronizedObject implements Serializable { 70 final Object delegate; 71 final Object mutex; 72 73 SynchronizedObject(Object delegate, @Nullable Object mutex) { 74 this.delegate = checkNotNull(delegate); 75 this.mutex = (mutex == null) ? this : mutex; 76 } 77 78 Object delegate() { 79 return delegate; 80 } 81 82 // No equals and hashCode; see ForwardingObject for details. 83 84 @Override 85 public String toString() { 86 synchronized (mutex) { 87 return delegate.toString(); 88 } 89 } 90 91 // Serialization invokes writeObject only when it's private. 92 // The SynchronizedObject subclasses don't need a writeObject method since 93 // they don't contain any non-transient member variables, while the 94 // following writeObject() handles the SynchronizedObject members. 95 96 @GwtIncompatible // java.io.ObjectOutputStream 97 private void writeObject(ObjectOutputStream stream) throws IOException { 98 synchronized (mutex) { 99 stream.defaultWriteObject(); 100 } 101 } 102 103 @GwtIncompatible // not needed in emulated source 104 private static final long serialVersionUID = 0; 105 } 106 107 private static <E> Collection<E> collection(Collection<E> collection, @Nullable Object mutex) { 108 return new SynchronizedCollection<E>(collection, mutex); 109 } 110 111 @VisibleForTesting 112 static class SynchronizedCollection<E> extends SynchronizedObject implements Collection<E> { 113 private SynchronizedCollection(Collection<E> delegate, @Nullable Object mutex) { 114 super(delegate, mutex); 115 } 116 117 @SuppressWarnings("unchecked") 118 @Override 119 Collection<E> delegate() { 120 return (Collection<E>) super.delegate(); 121 } 122 123 @Override 124 public boolean add(E e) { 125 synchronized (mutex) { 126 return delegate().add(e); 127 } 128 } 129 130 @Override 131 public boolean addAll(Collection<? extends E> c) { 132 synchronized (mutex) { 133 return delegate().addAll(c); 134 } 135 } 136 137 @Override 138 public void clear() { 139 synchronized (mutex) { 140 delegate().clear(); 141 } 142 } 143 144 @Override 145 public boolean contains(Object o) { 146 synchronized (mutex) { 147 return delegate().contains(o); 148 } 149 } 150 151 @Override 152 public boolean containsAll(Collection<?> c) { 153 synchronized (mutex) { 154 return delegate().containsAll(c); 155 } 156 } 157 158 @Override 159 public boolean isEmpty() { 160 synchronized (mutex) { 161 return delegate().isEmpty(); 162 } 163 } 164 165 @Override 166 public Iterator<E> iterator() { 167 return delegate().iterator(); // manually synchronized 168 } 169 170 @Override 171 public Spliterator<E> spliterator() { 172 synchronized (mutex) { 173 return delegate().spliterator(); 174 } 175 } 176 177 @Override 178 public Stream<E> stream() { 179 synchronized (mutex) { 180 return delegate().stream(); 181 } 182 } 183 184 @Override 185 public Stream<E> parallelStream() { 186 synchronized (mutex) { 187 return delegate().parallelStream(); 188 } 189 } 190 191 @Override 192 public void forEach(Consumer<? super E> action) { 193 synchronized (mutex) { 194 delegate().forEach(action); 195 } 196 } 197 198 @Override 199 public boolean remove(Object o) { 200 synchronized (mutex) { 201 return delegate().remove(o); 202 } 203 } 204 205 @Override 206 public boolean removeAll(Collection<?> c) { 207 synchronized (mutex) { 208 return delegate().removeAll(c); 209 } 210 } 211 212 @Override 213 public boolean retainAll(Collection<?> c) { 214 synchronized (mutex) { 215 return delegate().retainAll(c); 216 } 217 } 218 219 @Override 220 public boolean removeIf(Predicate<? super E> filter) { 221 synchronized (mutex) { 222 return delegate().removeIf(filter); 223 } 224 } 225 226 @Override 227 public int size() { 228 synchronized (mutex) { 229 return delegate().size(); 230 } 231 } 232 233 @Override 234 public Object[] toArray() { 235 synchronized (mutex) { 236 return delegate().toArray(); 237 } 238 } 239 240 @Override 241 public <T> T[] toArray(T[] a) { 242 synchronized (mutex) { 243 return delegate().toArray(a); 244 } 245 } 246 247 private static final long serialVersionUID = 0; 248 } 249 250 @VisibleForTesting 251 static <E> Set<E> set(Set<E> set, @Nullable Object mutex) { 252 return new SynchronizedSet<E>(set, mutex); 253 } 254 255 static class SynchronizedSet<E> extends SynchronizedCollection<E> implements Set<E> { 256 257 SynchronizedSet(Set<E> delegate, @Nullable Object mutex) { 258 super(delegate, mutex); 259 } 260 261 @Override 262 Set<E> delegate() { 263 return (Set<E>) super.delegate(); 264 } 265 266 @Override 267 public boolean equals(Object o) { 268 if (o == this) { 269 return true; 270 } 271 synchronized (mutex) { 272 return delegate().equals(o); 273 } 274 } 275 276 @Override 277 public int hashCode() { 278 synchronized (mutex) { 279 return delegate().hashCode(); 280 } 281 } 282 283 private static final long serialVersionUID = 0; 284 } 285 286 private static <E> SortedSet<E> sortedSet(SortedSet<E> set, @Nullable Object mutex) { 287 return new SynchronizedSortedSet<E>(set, mutex); 288 } 289 290 static class SynchronizedSortedSet<E> extends SynchronizedSet<E> implements SortedSet<E> { 291 SynchronizedSortedSet(SortedSet<E> delegate, @Nullable Object mutex) { 292 super(delegate, mutex); 293 } 294 295 @Override 296 SortedSet<E> delegate() { 297 return (SortedSet<E>) super.delegate(); 298 } 299 300 @Override 301 public Comparator<? super E> comparator() { 302 synchronized (mutex) { 303 return delegate().comparator(); 304 } 305 } 306 307 @Override 308 public SortedSet<E> subSet(E fromElement, E toElement) { 309 synchronized (mutex) { 310 return sortedSet(delegate().subSet(fromElement, toElement), mutex); 311 } 312 } 313 314 @Override 315 public SortedSet<E> headSet(E toElement) { 316 synchronized (mutex) { 317 return sortedSet(delegate().headSet(toElement), mutex); 318 } 319 } 320 321 @Override 322 public SortedSet<E> tailSet(E fromElement) { 323 synchronized (mutex) { 324 return sortedSet(delegate().tailSet(fromElement), mutex); 325 } 326 } 327 328 @Override 329 public E first() { 330 synchronized (mutex) { 331 return delegate().first(); 332 } 333 } 334 335 @Override 336 public E last() { 337 synchronized (mutex) { 338 return delegate().last(); 339 } 340 } 341 342 private static final long serialVersionUID = 0; 343 } 344 345 private static <E> List<E> list(List<E> list, @Nullable Object mutex) { 346 return (list instanceof RandomAccess) 347 ? new SynchronizedRandomAccessList<E>(list, mutex) 348 : new SynchronizedList<E>(list, mutex); 349 } 350 351 private static class SynchronizedList<E> extends SynchronizedCollection<E> implements List<E> { 352 SynchronizedList(List<E> delegate, @Nullable Object mutex) { 353 super(delegate, mutex); 354 } 355 356 @Override 357 List<E> delegate() { 358 return (List<E>) super.delegate(); 359 } 360 361 @Override 362 public void add(int index, E element) { 363 synchronized (mutex) { 364 delegate().add(index, element); 365 } 366 } 367 368 @Override 369 public boolean addAll(int index, Collection<? extends E> c) { 370 synchronized (mutex) { 371 return delegate().addAll(index, c); 372 } 373 } 374 375 @Override 376 public E get(int index) { 377 synchronized (mutex) { 378 return delegate().get(index); 379 } 380 } 381 382 @Override 383 public int indexOf(Object o) { 384 synchronized (mutex) { 385 return delegate().indexOf(o); 386 } 387 } 388 389 @Override 390 public int lastIndexOf(Object o) { 391 synchronized (mutex) { 392 return delegate().lastIndexOf(o); 393 } 394 } 395 396 @Override 397 public ListIterator<E> listIterator() { 398 return delegate().listIterator(); // manually synchronized 399 } 400 401 @Override 402 public ListIterator<E> listIterator(int index) { 403 return delegate().listIterator(index); // manually synchronized 404 } 405 406 @Override 407 public E remove(int index) { 408 synchronized (mutex) { 409 return delegate().remove(index); 410 } 411 } 412 413 @Override 414 public E set(int index, E element) { 415 synchronized (mutex) { 416 return delegate().set(index, element); 417 } 418 } 419 420 @Override 421 public void replaceAll(UnaryOperator<E> operator) { 422 synchronized (mutex) { 423 delegate().replaceAll(operator); 424 } 425 } 426 427 @Override 428 public void sort(Comparator<? super E> c) { 429 synchronized (mutex) { 430 delegate().sort(c); 431 } 432 } 433 434 @Override 435 public List<E> subList(int fromIndex, int toIndex) { 436 synchronized (mutex) { 437 return list(delegate().subList(fromIndex, toIndex), mutex); 438 } 439 } 440 441 @Override 442 public boolean equals(Object o) { 443 if (o == this) { 444 return true; 445 } 446 synchronized (mutex) { 447 return delegate().equals(o); 448 } 449 } 450 451 @Override 452 public int hashCode() { 453 synchronized (mutex) { 454 return delegate().hashCode(); 455 } 456 } 457 458 private static final long serialVersionUID = 0; 459 } 460 461 private static class SynchronizedRandomAccessList<E> extends SynchronizedList<E> 462 implements RandomAccess { 463 SynchronizedRandomAccessList(List<E> list, @Nullable Object mutex) { 464 super(list, mutex); 465 } 466 467 private static final long serialVersionUID = 0; 468 } 469 470 static <E> Multiset<E> multiset(Multiset<E> multiset, @Nullable Object mutex) { 471 if (multiset instanceof SynchronizedMultiset || multiset instanceof ImmutableMultiset) { 472 return multiset; 473 } 474 return new SynchronizedMultiset<E>(multiset, mutex); 475 } 476 477 private static class SynchronizedMultiset<E> extends SynchronizedCollection<E> 478 implements Multiset<E> { 479 transient @Nullable Set<E> elementSet; 480 transient @Nullable Set<Entry<E>> entrySet; 481 482 SynchronizedMultiset(Multiset<E> delegate, @Nullable Object mutex) { 483 super(delegate, mutex); 484 } 485 486 @Override 487 Multiset<E> delegate() { 488 return (Multiset<E>) super.delegate(); 489 } 490 491 @Override 492 public int count(Object o) { 493 synchronized (mutex) { 494 return delegate().count(o); 495 } 496 } 497 498 @Override 499 public int add(E e, int n) { 500 synchronized (mutex) { 501 return delegate().add(e, n); 502 } 503 } 504 505 @Override 506 public int remove(Object o, int n) { 507 synchronized (mutex) { 508 return delegate().remove(o, n); 509 } 510 } 511 512 @Override 513 public int setCount(E element, int count) { 514 synchronized (mutex) { 515 return delegate().setCount(element, count); 516 } 517 } 518 519 @Override 520 public boolean setCount(E element, int oldCount, int newCount) { 521 synchronized (mutex) { 522 return delegate().setCount(element, oldCount, newCount); 523 } 524 } 525 526 @Override 527 public Set<E> elementSet() { 528 synchronized (mutex) { 529 if (elementSet == null) { 530 elementSet = typePreservingSet(delegate().elementSet(), mutex); 531 } 532 return elementSet; 533 } 534 } 535 536 @Override 537 public Set<Entry<E>> entrySet() { 538 synchronized (mutex) { 539 if (entrySet == null) { 540 entrySet = typePreservingSet(delegate().entrySet(), mutex); 541 } 542 return entrySet; 543 } 544 } 545 546 @Override 547 public boolean equals(Object o) { 548 if (o == this) { 549 return true; 550 } 551 synchronized (mutex) { 552 return delegate().equals(o); 553 } 554 } 555 556 @Override 557 public int hashCode() { 558 synchronized (mutex) { 559 return delegate().hashCode(); 560 } 561 } 562 563 private static final long serialVersionUID = 0; 564 } 565 566 static <K, V> Multimap<K, V> multimap(Multimap<K, V> multimap, @Nullable Object mutex) { 567 if (multimap instanceof SynchronizedMultimap || multimap instanceof BaseImmutableMultimap) { 568 return multimap; 569 } 570 return new SynchronizedMultimap<>(multimap, mutex); 571 } 572 573 private static class SynchronizedMultimap<K, V> extends SynchronizedObject 574 implements Multimap<K, V> { 575 transient @Nullable Set<K> keySet; 576 transient @Nullable Collection<V> valuesCollection; 577 transient @Nullable Collection<Entry<K, V>> entries; 578 transient @Nullable Map<K, Collection<V>> asMap; 579 transient @Nullable Multiset<K> keys; 580 581 @SuppressWarnings("unchecked") 582 @Override 583 Multimap<K, V> delegate() { 584 return (Multimap<K, V>) super.delegate(); 585 } 586 587 SynchronizedMultimap(Multimap<K, V> delegate, @Nullable Object mutex) { 588 super(delegate, mutex); 589 } 590 591 @Override 592 public int size() { 593 synchronized (mutex) { 594 return delegate().size(); 595 } 596 } 597 598 @Override 599 public boolean isEmpty() { 600 synchronized (mutex) { 601 return delegate().isEmpty(); 602 } 603 } 604 605 @Override 606 public boolean containsKey(Object key) { 607 synchronized (mutex) { 608 return delegate().containsKey(key); 609 } 610 } 611 612 @Override 613 public boolean containsValue(Object value) { 614 synchronized (mutex) { 615 return delegate().containsValue(value); 616 } 617 } 618 619 @Override 620 public boolean containsEntry(Object key, Object value) { 621 synchronized (mutex) { 622 return delegate().containsEntry(key, value); 623 } 624 } 625 626 @Override 627 public Collection<V> get(K key) { 628 synchronized (mutex) { 629 return typePreservingCollection(delegate().get(key), mutex); 630 } 631 } 632 633 @Override 634 public boolean put(K key, V value) { 635 synchronized (mutex) { 636 return delegate().put(key, value); 637 } 638 } 639 640 @Override 641 public boolean putAll(K key, Iterable<? extends V> values) { 642 synchronized (mutex) { 643 return delegate().putAll(key, values); 644 } 645 } 646 647 @Override 648 public boolean putAll(Multimap<? extends K, ? extends V> multimap) { 649 synchronized (mutex) { 650 return delegate().putAll(multimap); 651 } 652 } 653 654 @Override 655 public Collection<V> replaceValues(K key, Iterable<? extends V> values) { 656 synchronized (mutex) { 657 return delegate().replaceValues(key, values); // copy not synchronized 658 } 659 } 660 661 @Override 662 public boolean remove(Object key, Object value) { 663 synchronized (mutex) { 664 return delegate().remove(key, value); 665 } 666 } 667 668 @Override 669 public Collection<V> removeAll(Object key) { 670 synchronized (mutex) { 671 return delegate().removeAll(key); // copy not synchronized 672 } 673 } 674 675 @Override 676 public void clear() { 677 synchronized (mutex) { 678 delegate().clear(); 679 } 680 } 681 682 @Override 683 public Set<K> keySet() { 684 synchronized (mutex) { 685 if (keySet == null) { 686 keySet = typePreservingSet(delegate().keySet(), mutex); 687 } 688 return keySet; 689 } 690 } 691 692 @Override 693 public Collection<V> values() { 694 synchronized (mutex) { 695 if (valuesCollection == null) { 696 valuesCollection = collection(delegate().values(), mutex); 697 } 698 return valuesCollection; 699 } 700 } 701 702 @Override 703 public Collection<Entry<K, V>> entries() { 704 synchronized (mutex) { 705 if (entries == null) { 706 entries = typePreservingCollection(delegate().entries(), mutex); 707 } 708 return entries; 709 } 710 } 711 712 @Override 713 public void forEach(BiConsumer<? super K, ? super V> action) { 714 synchronized (mutex) { 715 delegate().forEach(action); 716 } 717 } 718 719 @Override 720 public Map<K, Collection<V>> asMap() { 721 synchronized (mutex) { 722 if (asMap == null) { 723 asMap = new SynchronizedAsMap<>(delegate().asMap(), mutex); 724 } 725 return asMap; 726 } 727 } 728 729 @Override 730 public Multiset<K> keys() { 731 synchronized (mutex) { 732 if (keys == null) { 733 keys = multiset(delegate().keys(), mutex); 734 } 735 return keys; 736 } 737 } 738 739 @Override 740 public boolean equals(Object o) { 741 if (o == this) { 742 return true; 743 } 744 synchronized (mutex) { 745 return delegate().equals(o); 746 } 747 } 748 749 @Override 750 public int hashCode() { 751 synchronized (mutex) { 752 return delegate().hashCode(); 753 } 754 } 755 756 private static final long serialVersionUID = 0; 757 } 758 759 static <K, V> ListMultimap<K, V> listMultimap( 760 ListMultimap<K, V> multimap, @Nullable Object mutex) { 761 if (multimap instanceof SynchronizedListMultimap || multimap instanceof BaseImmutableMultimap) { 762 return multimap; 763 } 764 return new SynchronizedListMultimap<>(multimap, mutex); 765 } 766 767 private static class SynchronizedListMultimap<K, V> extends SynchronizedMultimap<K, V> 768 implements ListMultimap<K, V> { 769 SynchronizedListMultimap(ListMultimap<K, V> delegate, @Nullable Object mutex) { 770 super(delegate, mutex); 771 } 772 773 @Override 774 ListMultimap<K, V> delegate() { 775 return (ListMultimap<K, V>) super.delegate(); 776 } 777 778 @Override 779 public List<V> get(K key) { 780 synchronized (mutex) { 781 return list(delegate().get(key), mutex); 782 } 783 } 784 785 @Override 786 public List<V> removeAll(Object key) { 787 synchronized (mutex) { 788 return delegate().removeAll(key); // copy not synchronized 789 } 790 } 791 792 @Override 793 public List<V> replaceValues(K key, Iterable<? extends V> values) { 794 synchronized (mutex) { 795 return delegate().replaceValues(key, values); // copy not synchronized 796 } 797 } 798 799 private static final long serialVersionUID = 0; 800 } 801 802 static <K, V> SetMultimap<K, V> setMultimap(SetMultimap<K, V> multimap, @Nullable Object mutex) { 803 if (multimap instanceof SynchronizedSetMultimap || multimap instanceof BaseImmutableMultimap) { 804 return multimap; 805 } 806 return new SynchronizedSetMultimap<>(multimap, mutex); 807 } 808 809 private static class SynchronizedSetMultimap<K, V> extends SynchronizedMultimap<K, V> 810 implements SetMultimap<K, V> { 811 transient @Nullable Set<Entry<K, V>> entrySet; 812 813 SynchronizedSetMultimap(SetMultimap<K, V> delegate, @Nullable Object mutex) { 814 super(delegate, mutex); 815 } 816 817 @Override 818 SetMultimap<K, V> delegate() { 819 return (SetMultimap<K, V>) super.delegate(); 820 } 821 822 @Override 823 public Set<V> get(K key) { 824 synchronized (mutex) { 825 return set(delegate().get(key), mutex); 826 } 827 } 828 829 @Override 830 public Set<V> removeAll(Object key) { 831 synchronized (mutex) { 832 return delegate().removeAll(key); // copy not synchronized 833 } 834 } 835 836 @Override 837 public Set<V> replaceValues(K key, Iterable<? extends V> values) { 838 synchronized (mutex) { 839 return delegate().replaceValues(key, values); // copy not synchronized 840 } 841 } 842 843 @Override 844 public Set<Entry<K, V>> entries() { 845 synchronized (mutex) { 846 if (entrySet == null) { 847 entrySet = set(delegate().entries(), mutex); 848 } 849 return entrySet; 850 } 851 } 852 853 private static final long serialVersionUID = 0; 854 } 855 856 static <K, V> SortedSetMultimap<K, V> sortedSetMultimap( 857 SortedSetMultimap<K, V> multimap, @Nullable Object mutex) { 858 if (multimap instanceof SynchronizedSortedSetMultimap) { 859 return multimap; 860 } 861 return new SynchronizedSortedSetMultimap<>(multimap, mutex); 862 } 863 864 private static class SynchronizedSortedSetMultimap<K, V> extends SynchronizedSetMultimap<K, V> 865 implements SortedSetMultimap<K, V> { 866 SynchronizedSortedSetMultimap(SortedSetMultimap<K, V> delegate, @Nullable Object mutex) { 867 super(delegate, mutex); 868 } 869 870 @Override 871 SortedSetMultimap<K, V> delegate() { 872 return (SortedSetMultimap<K, V>) super.delegate(); 873 } 874 875 @Override 876 public SortedSet<V> get(K key) { 877 synchronized (mutex) { 878 return sortedSet(delegate().get(key), mutex); 879 } 880 } 881 882 @Override 883 public SortedSet<V> removeAll(Object key) { 884 synchronized (mutex) { 885 return delegate().removeAll(key); // copy not synchronized 886 } 887 } 888 889 @Override 890 public SortedSet<V> replaceValues(K key, Iterable<? extends V> values) { 891 synchronized (mutex) { 892 return delegate().replaceValues(key, values); // copy not synchronized 893 } 894 } 895 896 @Override 897 public Comparator<? super V> valueComparator() { 898 synchronized (mutex) { 899 return delegate().valueComparator(); 900 } 901 } 902 903 private static final long serialVersionUID = 0; 904 } 905 906 private static <E> Collection<E> typePreservingCollection( 907 Collection<E> collection, @Nullable Object mutex) { 908 if (collection instanceof SortedSet) { 909 return sortedSet((SortedSet<E>) collection, mutex); 910 } 911 if (collection instanceof Set) { 912 return set((Set<E>) collection, mutex); 913 } 914 if (collection instanceof List) { 915 return list((List<E>) collection, mutex); 916 } 917 return collection(collection, mutex); 918 } 919 920 private static <E> Set<E> typePreservingSet(Set<E> set, @Nullable Object mutex) { 921 if (set instanceof SortedSet) { 922 return sortedSet((SortedSet<E>) set, mutex); 923 } else { 924 return set(set, mutex); 925 } 926 } 927 928 private static class SynchronizedAsMapEntries<K, V> 929 extends SynchronizedSet<Entry<K, Collection<V>>> { 930 SynchronizedAsMapEntries(Set<Entry<K, Collection<V>>> delegate, @Nullable Object mutex) { 931 super(delegate, mutex); 932 } 933 934 @Override 935 public Iterator<Entry<K, Collection<V>>> iterator() { 936 // Must be manually synchronized. 937 return new TransformedIterator<Entry<K, Collection<V>>, Entry<K, Collection<V>>>( 938 super.iterator()) { 939 @Override 940 Entry<K, Collection<V>> transform(final Entry<K, Collection<V>> entry) { 941 return new ForwardingMapEntry<K, Collection<V>>() { 942 @Override 943 protected Entry<K, Collection<V>> delegate() { 944 return entry; 945 } 946 947 @Override 948 public Collection<V> getValue() { 949 return typePreservingCollection(entry.getValue(), mutex); 950 } 951 }; 952 } 953 }; 954 } 955 956 // See Collections.CheckedMap.CheckedEntrySet for details on attacks. 957 958 @Override 959 public Object[] toArray() { 960 synchronized (mutex) { 961 return ObjectArrays.toArrayImpl(delegate()); 962 } 963 } 964 965 @Override 966 public <T> T[] toArray(T[] array) { 967 synchronized (mutex) { 968 return ObjectArrays.toArrayImpl(delegate(), array); 969 } 970 } 971 972 @Override 973 public boolean contains(Object o) { 974 synchronized (mutex) { 975 return Maps.containsEntryImpl(delegate(), o); 976 } 977 } 978 979 @Override 980 public boolean containsAll(Collection<?> c) { 981 synchronized (mutex) { 982 return Collections2.containsAllImpl(delegate(), c); 983 } 984 } 985 986 @Override 987 public boolean equals(Object o) { 988 if (o == this) { 989 return true; 990 } 991 synchronized (mutex) { 992 return Sets.equalsImpl(delegate(), o); 993 } 994 } 995 996 @Override 997 public boolean remove(Object o) { 998 synchronized (mutex) { 999 return Maps.removeEntryImpl(delegate(), o); 1000 } 1001 } 1002 1003 @Override 1004 public boolean removeAll(Collection<?> c) { 1005 synchronized (mutex) { 1006 return Iterators.removeAll(delegate().iterator(), c); 1007 } 1008 } 1009 1010 @Override 1011 public boolean retainAll(Collection<?> c) { 1012 synchronized (mutex) { 1013 return Iterators.retainAll(delegate().iterator(), c); 1014 } 1015 } 1016 1017 private static final long serialVersionUID = 0; 1018 } 1019 1020 @VisibleForTesting 1021 static <K, V> Map<K, V> map(Map<K, V> map, @Nullable Object mutex) { 1022 return new SynchronizedMap<>(map, mutex); 1023 } 1024 1025 private static class SynchronizedMap<K, V> extends SynchronizedObject implements Map<K, V> { 1026 transient @Nullable Set<K> keySet; 1027 transient @Nullable Collection<V> values; 1028 transient @Nullable Set<Entry<K, V>> entrySet; 1029 1030 SynchronizedMap(Map<K, V> delegate, @Nullable Object mutex) { 1031 super(delegate, mutex); 1032 } 1033 1034 @SuppressWarnings("unchecked") 1035 @Override 1036 Map<K, V> delegate() { 1037 return (Map<K, V>) super.delegate(); 1038 } 1039 1040 @Override 1041 public void clear() { 1042 synchronized (mutex) { 1043 delegate().clear(); 1044 } 1045 } 1046 1047 @Override 1048 public boolean containsKey(Object key) { 1049 synchronized (mutex) { 1050 return delegate().containsKey(key); 1051 } 1052 } 1053 1054 @Override 1055 public boolean containsValue(Object value) { 1056 synchronized (mutex) { 1057 return delegate().containsValue(value); 1058 } 1059 } 1060 1061 @Override 1062 public Set<Entry<K, V>> entrySet() { 1063 synchronized (mutex) { 1064 if (entrySet == null) { 1065 entrySet = set(delegate().entrySet(), mutex); 1066 } 1067 return entrySet; 1068 } 1069 } 1070 1071 @Override 1072 public void forEach(BiConsumer<? super K, ? super V> action) { 1073 synchronized (mutex) { 1074 delegate().forEach(action); 1075 } 1076 } 1077 1078 @Override 1079 public V get(Object key) { 1080 synchronized (mutex) { 1081 return delegate().get(key); 1082 } 1083 } 1084 1085 @Override 1086 public V getOrDefault(Object key, V defaultValue) { 1087 synchronized (mutex) { 1088 return delegate().getOrDefault(key, defaultValue); 1089 } 1090 } 1091 1092 @Override 1093 public boolean isEmpty() { 1094 synchronized (mutex) { 1095 return delegate().isEmpty(); 1096 } 1097 } 1098 1099 @Override 1100 public Set<K> keySet() { 1101 synchronized (mutex) { 1102 if (keySet == null) { 1103 keySet = set(delegate().keySet(), mutex); 1104 } 1105 return keySet; 1106 } 1107 } 1108 1109 @Override 1110 public V put(K key, V value) { 1111 synchronized (mutex) { 1112 return delegate().put(key, value); 1113 } 1114 } 1115 1116 @Override 1117 public V putIfAbsent(K key, V value) { 1118 synchronized (mutex) { 1119 return delegate().putIfAbsent(key, value); 1120 } 1121 } 1122 1123 @Override 1124 public boolean replace(K key, V oldValue, V newValue) { 1125 synchronized (mutex) { 1126 return delegate().replace(key, oldValue, newValue); 1127 } 1128 } 1129 1130 @Override 1131 public V replace(K key, V value) { 1132 synchronized (mutex) { 1133 return delegate().replace(key, value); 1134 } 1135 } 1136 1137 @Override 1138 public V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) { 1139 synchronized (mutex) { 1140 return delegate().computeIfAbsent(key, mappingFunction); 1141 } 1142 } 1143 1144 @Override 1145 public V computeIfPresent( 1146 K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) { 1147 synchronized (mutex) { 1148 return delegate().computeIfPresent(key, remappingFunction); 1149 } 1150 } 1151 1152 @Override 1153 public V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) { 1154 synchronized (mutex) { 1155 return delegate().compute(key, remappingFunction); 1156 } 1157 } 1158 1159 @Override 1160 public V merge( 1161 K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) { 1162 synchronized (mutex) { 1163 return delegate().merge(key, value, remappingFunction); 1164 } 1165 } 1166 1167 @Override 1168 public void putAll(Map<? extends K, ? extends V> map) { 1169 synchronized (mutex) { 1170 delegate().putAll(map); 1171 } 1172 } 1173 1174 @Override 1175 public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) { 1176 synchronized (mutex) { 1177 delegate().replaceAll(function); 1178 } 1179 } 1180 1181 @Override 1182 public V remove(Object key) { 1183 synchronized (mutex) { 1184 return delegate().remove(key); 1185 } 1186 } 1187 1188 @Override 1189 public boolean remove(Object key, Object value) { 1190 synchronized (mutex) { 1191 return delegate().remove(key, value); 1192 } 1193 } 1194 1195 @Override 1196 public int size() { 1197 synchronized (mutex) { 1198 return delegate().size(); 1199 } 1200 } 1201 1202 @Override 1203 public Collection<V> values() { 1204 synchronized (mutex) { 1205 if (values == null) { 1206 values = collection(delegate().values(), mutex); 1207 } 1208 return values; 1209 } 1210 } 1211 1212 @Override 1213 public boolean equals(Object o) { 1214 if (o == this) { 1215 return true; 1216 } 1217 synchronized (mutex) { 1218 return delegate().equals(o); 1219 } 1220 } 1221 1222 @Override 1223 public int hashCode() { 1224 synchronized (mutex) { 1225 return delegate().hashCode(); 1226 } 1227 } 1228 1229 private static final long serialVersionUID = 0; 1230 } 1231 1232 static <K, V> SortedMap<K, V> sortedMap(SortedMap<K, V> sortedMap, @Nullable Object mutex) { 1233 return new SynchronizedSortedMap<>(sortedMap, mutex); 1234 } 1235 1236 static class SynchronizedSortedMap<K, V> extends SynchronizedMap<K, V> 1237 implements SortedMap<K, V> { 1238 1239 SynchronizedSortedMap(SortedMap<K, V> delegate, @Nullable Object mutex) { 1240 super(delegate, mutex); 1241 } 1242 1243 @Override 1244 SortedMap<K, V> delegate() { 1245 return (SortedMap<K, V>) super.delegate(); 1246 } 1247 1248 @Override 1249 public Comparator<? super K> comparator() { 1250 synchronized (mutex) { 1251 return delegate().comparator(); 1252 } 1253 } 1254 1255 @Override 1256 public K firstKey() { 1257 synchronized (mutex) { 1258 return delegate().firstKey(); 1259 } 1260 } 1261 1262 @Override 1263 public SortedMap<K, V> headMap(K toKey) { 1264 synchronized (mutex) { 1265 return sortedMap(delegate().headMap(toKey), mutex); 1266 } 1267 } 1268 1269 @Override 1270 public K lastKey() { 1271 synchronized (mutex) { 1272 return delegate().lastKey(); 1273 } 1274 } 1275 1276 @Override 1277 public SortedMap<K, V> subMap(K fromKey, K toKey) { 1278 synchronized (mutex) { 1279 return sortedMap(delegate().subMap(fromKey, toKey), mutex); 1280 } 1281 } 1282 1283 @Override 1284 public SortedMap<K, V> tailMap(K fromKey) { 1285 synchronized (mutex) { 1286 return sortedMap(delegate().tailMap(fromKey), mutex); 1287 } 1288 } 1289 1290 private static final long serialVersionUID = 0; 1291 } 1292 1293 static <K, V> BiMap<K, V> biMap(BiMap<K, V> bimap, @Nullable Object mutex) { 1294 if (bimap instanceof SynchronizedBiMap || bimap instanceof ImmutableBiMap) { 1295 return bimap; 1296 } 1297 return new SynchronizedBiMap<>(bimap, mutex, null); 1298 } 1299 1300 @VisibleForTesting 1301 static class SynchronizedBiMap<K, V> extends SynchronizedMap<K, V> 1302 implements BiMap<K, V>, Serializable { 1303 private transient @Nullable Set<V> valueSet; 1304 @RetainedWith private transient @Nullable BiMap<V, K> inverse; 1305 1306 private SynchronizedBiMap( 1307 BiMap<K, V> delegate, @Nullable Object mutex, @Nullable BiMap<V, K> inverse) { 1308 super(delegate, mutex); 1309 this.inverse = inverse; 1310 } 1311 1312 @Override 1313 BiMap<K, V> delegate() { 1314 return (BiMap<K, V>) super.delegate(); 1315 } 1316 1317 @Override 1318 public Set<V> values() { 1319 synchronized (mutex) { 1320 if (valueSet == null) { 1321 valueSet = set(delegate().values(), mutex); 1322 } 1323 return valueSet; 1324 } 1325 } 1326 1327 @Override 1328 public V forcePut(K key, V value) { 1329 synchronized (mutex) { 1330 return delegate().forcePut(key, value); 1331 } 1332 } 1333 1334 @Override 1335 public BiMap<V, K> inverse() { 1336 synchronized (mutex) { 1337 if (inverse == null) { 1338 inverse = new SynchronizedBiMap<>(delegate().inverse(), mutex, this); 1339 } 1340 return inverse; 1341 } 1342 } 1343 1344 private static final long serialVersionUID = 0; 1345 } 1346 1347 private static class SynchronizedAsMap<K, V> extends SynchronizedMap<K, Collection<V>> { 1348 transient @Nullable Set<Entry<K, Collection<V>>> asMapEntrySet; 1349 transient @Nullable Collection<Collection<V>> asMapValues; 1350 1351 SynchronizedAsMap(Map<K, Collection<V>> delegate, @Nullable Object mutex) { 1352 super(delegate, mutex); 1353 } 1354 1355 @Override 1356 public Collection<V> get(Object key) { 1357 synchronized (mutex) { 1358 Collection<V> collection = super.get(key); 1359 return (collection == null) ? null : typePreservingCollection(collection, mutex); 1360 } 1361 } 1362 1363 @Override 1364 public Set<Entry<K, Collection<V>>> entrySet() { 1365 synchronized (mutex) { 1366 if (asMapEntrySet == null) { 1367 asMapEntrySet = new SynchronizedAsMapEntries<>(delegate().entrySet(), mutex); 1368 } 1369 return asMapEntrySet; 1370 } 1371 } 1372 1373 @Override 1374 public Collection<Collection<V>> values() { 1375 synchronized (mutex) { 1376 if (asMapValues == null) { 1377 asMapValues = new SynchronizedAsMapValues<V>(delegate().values(), mutex); 1378 } 1379 return asMapValues; 1380 } 1381 } 1382 1383 @Override 1384 public boolean containsValue(Object o) { 1385 // values() and its contains() method are both synchronized. 1386 return values().contains(o); 1387 } 1388 1389 private static final long serialVersionUID = 0; 1390 } 1391 1392 private static class SynchronizedAsMapValues<V> extends SynchronizedCollection<Collection<V>> { 1393 SynchronizedAsMapValues(Collection<Collection<V>> delegate, @Nullable Object mutex) { 1394 super(delegate, mutex); 1395 } 1396 1397 @Override 1398 public Iterator<Collection<V>> iterator() { 1399 // Must be manually synchronized. 1400 return new TransformedIterator<Collection<V>, Collection<V>>(super.iterator()) { 1401 @Override 1402 Collection<V> transform(Collection<V> from) { 1403 return typePreservingCollection(from, mutex); 1404 } 1405 }; 1406 } 1407 1408 private static final long serialVersionUID = 0; 1409 } 1410 1411 @GwtIncompatible // NavigableSet 1412 @VisibleForTesting 1413 static class SynchronizedNavigableSet<E> extends SynchronizedSortedSet<E> 1414 implements NavigableSet<E> { 1415 SynchronizedNavigableSet(NavigableSet<E> delegate, @Nullable Object mutex) { 1416 super(delegate, mutex); 1417 } 1418 1419 @Override 1420 NavigableSet<E> delegate() { 1421 return (NavigableSet<E>) super.delegate(); 1422 } 1423 1424 @Override 1425 public E ceiling(E e) { 1426 synchronized (mutex) { 1427 return delegate().ceiling(e); 1428 } 1429 } 1430 1431 @Override 1432 public Iterator<E> descendingIterator() { 1433 return delegate().descendingIterator(); // manually synchronized 1434 } 1435 1436 transient @Nullable NavigableSet<E> descendingSet; 1437 1438 @Override 1439 public NavigableSet<E> descendingSet() { 1440 synchronized (mutex) { 1441 if (descendingSet == null) { 1442 NavigableSet<E> dS = Synchronized.navigableSet(delegate().descendingSet(), mutex); 1443 descendingSet = dS; 1444 return dS; 1445 } 1446 return descendingSet; 1447 } 1448 } 1449 1450 @Override 1451 public E floor(E e) { 1452 synchronized (mutex) { 1453 return delegate().floor(e); 1454 } 1455 } 1456 1457 @Override 1458 public NavigableSet<E> headSet(E toElement, boolean inclusive) { 1459 synchronized (mutex) { 1460 return Synchronized.navigableSet(delegate().headSet(toElement, inclusive), mutex); 1461 } 1462 } 1463 1464 @Override 1465 public SortedSet<E> headSet(E toElement) { 1466 return headSet(toElement, false); 1467 } 1468 1469 @Override 1470 public E higher(E e) { 1471 synchronized (mutex) { 1472 return delegate().higher(e); 1473 } 1474 } 1475 1476 @Override 1477 public E lower(E e) { 1478 synchronized (mutex) { 1479 return delegate().lower(e); 1480 } 1481 } 1482 1483 @Override 1484 public E pollFirst() { 1485 synchronized (mutex) { 1486 return delegate().pollFirst(); 1487 } 1488 } 1489 1490 @Override 1491 public E pollLast() { 1492 synchronized (mutex) { 1493 return delegate().pollLast(); 1494 } 1495 } 1496 1497 @Override 1498 public NavigableSet<E> subSet( 1499 E fromElement, boolean fromInclusive, E toElement, boolean toInclusive) { 1500 synchronized (mutex) { 1501 return Synchronized.navigableSet( 1502 delegate().subSet(fromElement, fromInclusive, toElement, toInclusive), mutex); 1503 } 1504 } 1505 1506 @Override 1507 public SortedSet<E> subSet(E fromElement, E toElement) { 1508 return subSet(fromElement, true, toElement, false); 1509 } 1510 1511 @Override 1512 public NavigableSet<E> tailSet(E fromElement, boolean inclusive) { 1513 synchronized (mutex) { 1514 return Synchronized.navigableSet(delegate().tailSet(fromElement, inclusive), mutex); 1515 } 1516 } 1517 1518 @Override 1519 public SortedSet<E> tailSet(E fromElement) { 1520 return tailSet(fromElement, true); 1521 } 1522 1523 private static final long serialVersionUID = 0; 1524 } 1525 1526 @GwtIncompatible // NavigableSet 1527 static <E> NavigableSet<E> navigableSet(NavigableSet<E> navigableSet, @Nullable Object mutex) { 1528 return new SynchronizedNavigableSet<E>(navigableSet, mutex); 1529 } 1530 1531 @GwtIncompatible // NavigableSet 1532 static <E> NavigableSet<E> navigableSet(NavigableSet<E> navigableSet) { 1533 return navigableSet(navigableSet, null); 1534 } 1535 1536 @GwtIncompatible // NavigableMap 1537 static <K, V> NavigableMap<K, V> navigableMap(NavigableMap<K, V> navigableMap) { 1538 return navigableMap(navigableMap, null); 1539 } 1540 1541 @GwtIncompatible // NavigableMap 1542 static <K, V> NavigableMap<K, V> navigableMap( 1543 NavigableMap<K, V> navigableMap, @Nullable Object mutex) { 1544 return new SynchronizedNavigableMap<>(navigableMap, mutex); 1545 } 1546 1547 @GwtIncompatible // NavigableMap 1548 @VisibleForTesting 1549 static class SynchronizedNavigableMap<K, V> extends SynchronizedSortedMap<K, V> 1550 implements NavigableMap<K, V> { 1551 1552 SynchronizedNavigableMap(NavigableMap<K, V> delegate, @Nullable Object mutex) { 1553 super(delegate, mutex); 1554 } 1555 1556 @Override 1557 NavigableMap<K, V> delegate() { 1558 return (NavigableMap<K, V>) super.delegate(); 1559 } 1560 1561 @Override 1562 public Entry<K, V> ceilingEntry(K key) { 1563 synchronized (mutex) { 1564 return nullableSynchronizedEntry(delegate().ceilingEntry(key), mutex); 1565 } 1566 } 1567 1568 @Override 1569 public K ceilingKey(K key) { 1570 synchronized (mutex) { 1571 return delegate().ceilingKey(key); 1572 } 1573 } 1574 1575 transient @Nullable NavigableSet<K> descendingKeySet; 1576 1577 @Override 1578 public NavigableSet<K> descendingKeySet() { 1579 synchronized (mutex) { 1580 if (descendingKeySet == null) { 1581 return descendingKeySet = Synchronized.navigableSet(delegate().descendingKeySet(), mutex); 1582 } 1583 return descendingKeySet; 1584 } 1585 } 1586 1587 transient @Nullable NavigableMap<K, V> descendingMap; 1588 1589 @Override 1590 public NavigableMap<K, V> descendingMap() { 1591 synchronized (mutex) { 1592 if (descendingMap == null) { 1593 return descendingMap = navigableMap(delegate().descendingMap(), mutex); 1594 } 1595 return descendingMap; 1596 } 1597 } 1598 1599 @Override 1600 public Entry<K, V> firstEntry() { 1601 synchronized (mutex) { 1602 return nullableSynchronizedEntry(delegate().firstEntry(), mutex); 1603 } 1604 } 1605 1606 @Override 1607 public Entry<K, V> floorEntry(K key) { 1608 synchronized (mutex) { 1609 return nullableSynchronizedEntry(delegate().floorEntry(key), mutex); 1610 } 1611 } 1612 1613 @Override 1614 public K floorKey(K key) { 1615 synchronized (mutex) { 1616 return delegate().floorKey(key); 1617 } 1618 } 1619 1620 @Override 1621 public NavigableMap<K, V> headMap(K toKey, boolean inclusive) { 1622 synchronized (mutex) { 1623 return navigableMap(delegate().headMap(toKey, inclusive), mutex); 1624 } 1625 } 1626 1627 @Override 1628 public SortedMap<K, V> headMap(K toKey) { 1629 return headMap(toKey, false); 1630 } 1631 1632 @Override 1633 public Entry<K, V> higherEntry(K key) { 1634 synchronized (mutex) { 1635 return nullableSynchronizedEntry(delegate().higherEntry(key), mutex); 1636 } 1637 } 1638 1639 @Override 1640 public K higherKey(K key) { 1641 synchronized (mutex) { 1642 return delegate().higherKey(key); 1643 } 1644 } 1645 1646 @Override 1647 public Entry<K, V> lastEntry() { 1648 synchronized (mutex) { 1649 return nullableSynchronizedEntry(delegate().lastEntry(), mutex); 1650 } 1651 } 1652 1653 @Override 1654 public Entry<K, V> lowerEntry(K key) { 1655 synchronized (mutex) { 1656 return nullableSynchronizedEntry(delegate().lowerEntry(key), mutex); 1657 } 1658 } 1659 1660 @Override 1661 public K lowerKey(K key) { 1662 synchronized (mutex) { 1663 return delegate().lowerKey(key); 1664 } 1665 } 1666 1667 @Override 1668 public Set<K> keySet() { 1669 return navigableKeySet(); 1670 } 1671 1672 transient @Nullable NavigableSet<K> navigableKeySet; 1673 1674 @Override 1675 public NavigableSet<K> navigableKeySet() { 1676 synchronized (mutex) { 1677 if (navigableKeySet == null) { 1678 return navigableKeySet = Synchronized.navigableSet(delegate().navigableKeySet(), mutex); 1679 } 1680 return navigableKeySet; 1681 } 1682 } 1683 1684 @Override 1685 public Entry<K, V> pollFirstEntry() { 1686 synchronized (mutex) { 1687 return nullableSynchronizedEntry(delegate().pollFirstEntry(), mutex); 1688 } 1689 } 1690 1691 @Override 1692 public Entry<K, V> pollLastEntry() { 1693 synchronized (mutex) { 1694 return nullableSynchronizedEntry(delegate().pollLastEntry(), mutex); 1695 } 1696 } 1697 1698 @Override 1699 public NavigableMap<K, V> subMap( 1700 K fromKey, boolean fromInclusive, K toKey, boolean toInclusive) { 1701 synchronized (mutex) { 1702 return navigableMap(delegate().subMap(fromKey, fromInclusive, toKey, toInclusive), mutex); 1703 } 1704 } 1705 1706 @Override 1707 public SortedMap<K, V> subMap(K fromKey, K toKey) { 1708 return subMap(fromKey, true, toKey, false); 1709 } 1710 1711 @Override 1712 public NavigableMap<K, V> tailMap(K fromKey, boolean inclusive) { 1713 synchronized (mutex) { 1714 return navigableMap(delegate().tailMap(fromKey, inclusive), mutex); 1715 } 1716 } 1717 1718 @Override 1719 public SortedMap<K, V> tailMap(K fromKey) { 1720 return tailMap(fromKey, true); 1721 } 1722 1723 private static final long serialVersionUID = 0; 1724 } 1725 1726 @GwtIncompatible // works but is needed only for NavigableMap 1727 private static <K, V> Entry<K, V> nullableSynchronizedEntry( 1728 @Nullable Entry<K, V> entry, @Nullable Object mutex) { 1729 if (entry == null) { 1730 return null; 1731 } 1732 return new SynchronizedEntry<>(entry, mutex); 1733 } 1734 1735 @GwtIncompatible // works but is needed only for NavigableMap 1736 private static class SynchronizedEntry<K, V> extends SynchronizedObject implements Entry<K, V> { 1737 1738 SynchronizedEntry(Entry<K, V> delegate, @Nullable Object mutex) { 1739 super(delegate, mutex); 1740 } 1741 1742 @SuppressWarnings("unchecked") // guaranteed by the constructor 1743 @Override 1744 Entry<K, V> delegate() { 1745 return (Entry<K, V>) super.delegate(); 1746 } 1747 1748 @Override 1749 public boolean equals(Object obj) { 1750 synchronized (mutex) { 1751 return delegate().equals(obj); 1752 } 1753 } 1754 1755 @Override 1756 public int hashCode() { 1757 synchronized (mutex) { 1758 return delegate().hashCode(); 1759 } 1760 } 1761 1762 @Override 1763 public K getKey() { 1764 synchronized (mutex) { 1765 return delegate().getKey(); 1766 } 1767 } 1768 1769 @Override 1770 public V getValue() { 1771 synchronized (mutex) { 1772 return delegate().getValue(); 1773 } 1774 } 1775 1776 @Override 1777 public V setValue(V value) { 1778 synchronized (mutex) { 1779 return delegate().setValue(value); 1780 } 1781 } 1782 1783 private static final long serialVersionUID = 0; 1784 } 1785 1786 static <E> Queue<E> queue(Queue<E> queue, @Nullable Object mutex) { 1787 return (queue instanceof SynchronizedQueue) ? queue : new SynchronizedQueue<E>(queue, mutex); 1788 } 1789 1790 private static class SynchronizedQueue<E> extends SynchronizedCollection<E> implements Queue<E> { 1791 1792 SynchronizedQueue(Queue<E> delegate, @Nullable Object mutex) { 1793 super(delegate, mutex); 1794 } 1795 1796 @Override 1797 Queue<E> delegate() { 1798 return (Queue<E>) super.delegate(); 1799 } 1800 1801 @Override 1802 public E element() { 1803 synchronized (mutex) { 1804 return delegate().element(); 1805 } 1806 } 1807 1808 @Override 1809 public boolean offer(E e) { 1810 synchronized (mutex) { 1811 return delegate().offer(e); 1812 } 1813 } 1814 1815 @Override 1816 public E peek() { 1817 synchronized (mutex) { 1818 return delegate().peek(); 1819 } 1820 } 1821 1822 @Override 1823 public E poll() { 1824 synchronized (mutex) { 1825 return delegate().poll(); 1826 } 1827 } 1828 1829 @Override 1830 public E remove() { 1831 synchronized (mutex) { 1832 return delegate().remove(); 1833 } 1834 } 1835 1836 private static final long serialVersionUID = 0; 1837 } 1838 1839 static <E> Deque<E> deque(Deque<E> deque, @Nullable Object mutex) { 1840 return new SynchronizedDeque<E>(deque, mutex); 1841 } 1842 1843 private static final class SynchronizedDeque<E> extends SynchronizedQueue<E> implements Deque<E> { 1844 1845 SynchronizedDeque(Deque<E> delegate, @Nullable Object mutex) { 1846 super(delegate, mutex); 1847 } 1848 1849 @Override 1850 Deque<E> delegate() { 1851 return (Deque<E>) super.delegate(); 1852 } 1853 1854 @Override 1855 public void addFirst(E e) { 1856 synchronized (mutex) { 1857 delegate().addFirst(e); 1858 } 1859 } 1860 1861 @Override 1862 public void addLast(E e) { 1863 synchronized (mutex) { 1864 delegate().addLast(e); 1865 } 1866 } 1867 1868 @Override 1869 public boolean offerFirst(E e) { 1870 synchronized (mutex) { 1871 return delegate().offerFirst(e); 1872 } 1873 } 1874 1875 @Override 1876 public boolean offerLast(E e) { 1877 synchronized (mutex) { 1878 return delegate().offerLast(e); 1879 } 1880 } 1881 1882 @Override 1883 public E removeFirst() { 1884 synchronized (mutex) { 1885 return delegate().removeFirst(); 1886 } 1887 } 1888 1889 @Override 1890 public E removeLast() { 1891 synchronized (mutex) { 1892 return delegate().removeLast(); 1893 } 1894 } 1895 1896 @Override 1897 public E pollFirst() { 1898 synchronized (mutex) { 1899 return delegate().pollFirst(); 1900 } 1901 } 1902 1903 @Override 1904 public E pollLast() { 1905 synchronized (mutex) { 1906 return delegate().pollLast(); 1907 } 1908 } 1909 1910 @Override 1911 public E getFirst() { 1912 synchronized (mutex) { 1913 return delegate().getFirst(); 1914 } 1915 } 1916 1917 @Override 1918 public E getLast() { 1919 synchronized (mutex) { 1920 return delegate().getLast(); 1921 } 1922 } 1923 1924 @Override 1925 public E peekFirst() { 1926 synchronized (mutex) { 1927 return delegate().peekFirst(); 1928 } 1929 } 1930 1931 @Override 1932 public E peekLast() { 1933 synchronized (mutex) { 1934 return delegate().peekLast(); 1935 } 1936 } 1937 1938 @Override 1939 public boolean removeFirstOccurrence(Object o) { 1940 synchronized (mutex) { 1941 return delegate().removeFirstOccurrence(o); 1942 } 1943 } 1944 1945 @Override 1946 public boolean removeLastOccurrence(Object o) { 1947 synchronized (mutex) { 1948 return delegate().removeLastOccurrence(o); 1949 } 1950 } 1951 1952 @Override 1953 public void push(E e) { 1954 synchronized (mutex) { 1955 delegate().push(e); 1956 } 1957 } 1958 1959 @Override 1960 public E pop() { 1961 synchronized (mutex) { 1962 return delegate().pop(); 1963 } 1964 } 1965 1966 @Override 1967 public Iterator<E> descendingIterator() { 1968 synchronized (mutex) { 1969 return delegate().descendingIterator(); 1970 } 1971 } 1972 1973 private static final long serialVersionUID = 0; 1974 } 1975 1976 static <R, C, V> Table<R, C, V> table(Table<R, C, V> table, Object mutex) { 1977 return new SynchronizedTable<>(table, mutex); 1978 } 1979 1980 private static final class SynchronizedTable<R, C, V> extends SynchronizedObject 1981 implements Table<R, C, V> { 1982 1983 SynchronizedTable(Table<R, C, V> delegate, Object mutex) { 1984 super(delegate, mutex); 1985 } 1986 1987 @SuppressWarnings("unchecked") 1988 @Override 1989 Table<R, C, V> delegate() { 1990 return (Table<R, C, V>) super.delegate(); 1991 } 1992 1993 @Override 1994 public boolean contains(@Nullable Object rowKey, @Nullable Object columnKey) { 1995 synchronized (mutex) { 1996 return delegate().contains(rowKey, columnKey); 1997 } 1998 } 1999 2000 @Override 2001 public boolean containsRow(@Nullable Object rowKey) { 2002 synchronized (mutex) { 2003 return delegate().containsRow(rowKey); 2004 } 2005 } 2006 2007 @Override 2008 public boolean containsColumn(@Nullable Object columnKey) { 2009 synchronized (mutex) { 2010 return delegate().containsColumn(columnKey); 2011 } 2012 } 2013 2014 @Override 2015 public boolean containsValue(@Nullable Object value) { 2016 synchronized (mutex) { 2017 return delegate().containsValue(value); 2018 } 2019 } 2020 2021 @Override 2022 public V get(@Nullable Object rowKey, @Nullable Object columnKey) { 2023 synchronized (mutex) { 2024 return delegate().get(rowKey, columnKey); 2025 } 2026 } 2027 2028 @Override 2029 public boolean isEmpty() { 2030 synchronized (mutex) { 2031 return delegate().isEmpty(); 2032 } 2033 } 2034 2035 @Override 2036 public int size() { 2037 synchronized (mutex) { 2038 return delegate().size(); 2039 } 2040 } 2041 2042 @Override 2043 public void clear() { 2044 synchronized (mutex) { 2045 delegate().clear(); 2046 } 2047 } 2048 2049 @Override 2050 public V put(@Nullable R rowKey, @Nullable C columnKey, @Nullable V value) { 2051 synchronized (mutex) { 2052 return delegate().put(rowKey, columnKey, value); 2053 } 2054 } 2055 2056 @Override 2057 public void putAll(Table<? extends R, ? extends C, ? extends V> table) { 2058 synchronized (mutex) { 2059 delegate().putAll(table); 2060 } 2061 } 2062 2063 @Override 2064 public V remove(@Nullable Object rowKey, @Nullable Object columnKey) { 2065 synchronized (mutex) { 2066 return delegate().remove(rowKey, columnKey); 2067 } 2068 } 2069 2070 @Override 2071 public Map<C, V> row(@Nullable R rowKey) { 2072 synchronized (mutex) { 2073 return map(delegate().row(rowKey), mutex); 2074 } 2075 } 2076 2077 @Override 2078 public Map<R, V> column(@Nullable C columnKey) { 2079 synchronized (mutex) { 2080 return map(delegate().column(columnKey), mutex); 2081 } 2082 } 2083 2084 @Override 2085 public Set<Cell<R, C, V>> cellSet() { 2086 synchronized (mutex) { 2087 return set(delegate().cellSet(), mutex); 2088 } 2089 } 2090 2091 @Override 2092 public Set<R> rowKeySet() { 2093 synchronized (mutex) { 2094 return set(delegate().rowKeySet(), mutex); 2095 } 2096 } 2097 2098 @Override 2099 public Set<C> columnKeySet() { 2100 synchronized (mutex) { 2101 return set(delegate().columnKeySet(), mutex); 2102 } 2103 } 2104 2105 @Override 2106 public Collection<V> values() { 2107 synchronized (mutex) { 2108 return collection(delegate().values(), mutex); 2109 } 2110 } 2111 2112 @Override 2113 public Map<R, Map<C, V>> rowMap() { 2114 synchronized (mutex) { 2115 return map( 2116 Maps.transformValues( 2117 delegate().rowMap(), 2118 new com.google.common.base.Function<Map<C, V>, Map<C, V>>() { 2119 @Override 2120 public Map<C, V> apply(Map<C, V> t) { 2121 return map(t, mutex); 2122 } 2123 }), 2124 mutex); 2125 } 2126 } 2127 2128 @Override 2129 public Map<C, Map<R, V>> columnMap() { 2130 synchronized (mutex) { 2131 return map( 2132 Maps.transformValues( 2133 delegate().columnMap(), 2134 new com.google.common.base.Function<Map<R, V>, Map<R, V>>() { 2135 @Override 2136 public Map<R, V> apply(Map<R, V> t) { 2137 return map(t, mutex); 2138 } 2139 }), 2140 mutex); 2141 } 2142 } 2143 2144 @Override 2145 public int hashCode() { 2146 synchronized (mutex) { 2147 return delegate().hashCode(); 2148 } 2149 } 2150 2151 @Override 2152 public boolean equals(@Nullable Object obj) { 2153 if (this == obj) { 2154 return true; 2155 } 2156 synchronized (mutex) { 2157 return delegate().equals(obj); 2158 } 2159 } 2160 } 2161 }