1 17 18 package org.sape.carbon.core.util.thread; 19 20 33 34 import java.util.HashMap ; 35 36 83 public class ReentrantWriterPreferenceReadWriteLock extends WriterPreferenceReadWriteLock { 84 85 86 protected long writeHolds_ = 0; 87 88 89 protected HashMap readers_ = new HashMap (); 90 91 92 protected static final Integer IONE = new Integer (1); 93 94 95 protected boolean allowReader() { 96 return (activeWriter_ == null && waitingWriters_ == 0) || 97 activeWriter_ == Thread.currentThread(); 98 } 99 100 protected synchronized boolean startRead() { 101 Thread t = Thread.currentThread(); 102 Object c = readers_.get(t); 103 if (c != null) { readers_.put(t, new Integer (((Integer )(c)).intValue()+1)); 105 ++activeReaders_; 106 return true; 107 } 108 else if (allowReader()) { 109 readers_.put(t, IONE); 110 ++activeReaders_; 111 return true; 112 } 113 else 114 return false; 115 } 116 117 protected synchronized boolean startWrite() { 118 if (activeWriter_ == Thread.currentThread()) { ++writeHolds_; 120 return true; 121 } 122 else if (writeHolds_ == 0) { 123 if (activeReaders_ == 0 || 124 (readers_.size() == 1 && 125 readers_.get(Thread.currentThread()) != null)) { 126 activeWriter_ = Thread.currentThread(); 127 writeHolds_ = 1; 128 return true; 129 } 130 else 131 return false; 132 } 133 else 134 return false; 135 } 136 137 138 protected synchronized Signaller endRead() { 139 Thread t = Thread.currentThread(); 140 Object c = readers_.get(t); 141 if (c == null) 142 throw new IllegalStateException (); 143 --activeReaders_; 144 if (c != IONE) { int h = ((Integer )(c)).intValue()-1; 146 Integer ih = (h == 1)? IONE : new Integer (h); 147 readers_.put(t, ih); 148 return null; 149 } 150 else { 151 readers_.remove(t); 152 153 if (writeHolds_ > 0) return null; 155 else if (activeReaders_ == 0 && waitingWriters_ > 0) 156 return writerLock_; 157 else 158 return null; 159 } 160 } 161 162 protected synchronized Signaller endWrite() { 163 --writeHolds_; 164 if (writeHolds_ > 0) return null; 166 else { 167 activeWriter_ = null; 168 if (waitingReaders_ > 0 && allowReader()) 169 return readerLock_; 170 else if (waitingWriters_ > 0) 171 return writerLock_; 172 else 173 return null; 174 } 175 } 176 177 } 178 179 | Popular Tags |