Actually, the example given might be typesafe. Further, it might even be a reasonably good idea.
If multiple threads hit the null check before the first thread has written to _instance (and indeed, perhaps after the first thread has written to _instance, but before the second thread's CPU has got the new value loaded into its cache), then the second (and third, and fourth...) thread will create a new instance and write this to _instance.
In a garbage-collected language, this just means that for a brief while multiple threads will have their own version of _instance, but soon enough they'll drop out of scope and be eligible for garbage collection.
Now, this is wasteful, but whether its actually a problem or not depends on how expensive creating a new instance is and whether there are any negative consequences in having more than one in existence. Very often the downside of such needless duplication of instance objects is pretty slight, in which case it might be less of a negative than the cost of locking (locking is relatively cheap but not free, waiting for a lock can be quite expensive, and in some cases [deadlock being the most extreme case] cripplingly expensive), or even of CASsing. Even if it is more expensive, it may still not actually be unsafe.
Since we can't judge whether this is the case in the example above, we don't actually know if it's thread-safe or not.
Most likely, creating upon static construction is the way to go, though.