diff --git a/window.go b/window.go
index d725ebddcf3b035bf8e0b04835a3e118e6553229..5ef584f7a39c772a1deb3f8d3ec91e7c700b55b7 100644
--- a/window.go
+++ b/window.go
@@ -1,6 +1,8 @@
 package pixel
 
 import (
+	"sync"
+
 	"github.com/faiface/pixel/pixelgl"
 	"github.com/go-gl/gl/v3.3-core/gl"
 	"github.com/go-gl/glfw/v3.2/glfw"
@@ -81,19 +83,24 @@ func (w *Window) Update() {
 	w.End()
 }
 
-var currentWindow *Window = nil
+var (
+	windowMutex   sync.Mutex
+	currentWindow *Window
+)
 
 func (w *Window) Begin() {
-	pixelgl.Do(func() {
-		if currentWindow != w {
+	needSwitch := pixelgl.DoVal(func() interface{} {
+		return currentWindow != w
+	}).(bool)
+	if needSwitch {
+		windowMutex.Lock()
+		pixelgl.Do(func() {
 			w.window.MakeContextCurrent()
 			pixelgl.Init()
-			currentWindow = w
-		}
-	})
-
+		})
+	}
 }
 
 func (w *Window) End() {
-	// nothing really
+	windowMutex.Unlock()
 }