Index: /trunk/source/level-1/l1-aprims.lisp
===================================================================
--- /trunk/source/level-1/l1-aprims.lisp	(revision 14552)
+++ /trunk/source/level-1/l1-aprims.lisp	(revision 14553)
@@ -55,5 +55,4 @@
 
 (def-standard-initial-binding *package*)
-(def-standard-initial-binding *gensym-counter* 0)
 (def-standard-initial-binding *random-state* (initial-random-state))
 (def-standard-initial-binding *whostate* "Reset")
Index: /trunk/source/level-1/l1-utils.lisp
===================================================================
--- /trunk/source/level-1/l1-utils.lisp	(revision 14552)
+++ /trunk/source/level-1/l1-utils.lisp	(revision 14553)
@@ -755,4 +755,8 @@
 ;;;;;;;;; VALUE BINDING Functions
 
+;; Lock used only to make sure calls to GENSYM don't step on each other.  Users who
+;; modify *gensym-counter* in multi-threaded apps will need to do their own locking.
+(defparameter *gensym-lock* (make-lock))
+
 (defun gensym (&optional (string-or-integer nil string-or-integer-p))
   "Creates a new uninterned symbol whose name is a prefix string (defaults
@@ -769,5 +773,6 @@
         (string (setq prefix (ensure-simple-string string-or-integer)))))
     (unless counter
-      (setq *gensym-counter* (1+ (setq counter *gensym-counter*))))
+      (with-lock-grabbed (*gensym-lock*)
+        (setq *gensym-counter* (1+ (setq counter *gensym-counter*)))))
     (make-symbol (%str-cat prefix (%integer-to-string counter)))))
 
