Revert 60189 and restore performance.
diff --git a/Lib/threading.py b/Lib/threading.py
index 50cbb06..409360d 100644
--- a/Lib/threading.py
+++ b/Lib/threading.py
@@ -347,18 +347,27 @@
         return self.__flag
 
     def set(self):
-        with self.__cond:
+        self.__cond.acquire()
+        try:
             self.__flag = True
             self.__cond.notifyAll()
+        finally:
+            self.__cond.release()
 
     def clear(self):
-        with self.__cond:
+        self.__cond.acquire()
+        try:
             self.__flag = False
+        finally:
+            self.__cond.release()
 
     def wait(self, timeout=None):
-        with self.__cond:
+        self.__cond.acquire()
+        try:
             if not self.__flag:
                 self.__cond.wait(timeout)
+        finally:
+            self.__cond.release()
 
 # Helper to generate new thread names
 _counter = 0
@@ -525,9 +534,10 @@
                     pass
 
     def __stop(self):
-        with self.__block:
-            self.__stopped = True
-            self.__block.notifyAll()
+        self.__block.acquire()
+        self.__stopped = True
+        self.__block.notifyAll()
+        self.__block.release()
 
     def __delete(self):
         "Remove current thread from the dict of currently running threads."
@@ -553,12 +563,15 @@
         # since it isn't if dummy_threading is *not* being used then don't
         # hide the exception.
 
-        with _active_limbo_lock:
+        _active_limbo_lock.acquire()
+        try:
             try:
                 del _active[_get_ident()]
             except KeyError:
                 if 'dummy_threading' not in _sys.modules:
                     raise
+        finally:
+            _active_limbo_lock.release()
 
     def join(self, timeout=None):
         if not self.__initialized:
@@ -571,7 +584,8 @@
         if __debug__:
             if not self.__stopped:
                 self._note("%s.join(): waiting until thread stops", self)
-        with self.__block:
+        self.__block.acquire()
+        try:
             if timeout is None:
                 while not self.__stopped:
                     self.__block.wait()
@@ -589,6 +603,8 @@
                 else:
                     if __debug__:
                         self._note("%s.join(): thread stopped", self)
+        finally:
+            self.__block.release()
 
     def getName(self):
         assert self.__initialized, "Thread.__init__() not called"