Describe your experience with multi-threading. How do you ensure thread safety in a high-concurrency Java application?