static final ThreadLocal ভেরিয়েবলগুলি থ্রেড নিরাপদ।
staticথ্রেডলোকাল ভেরিয়েবলকে কেবলমাত্র সংশ্লিষ্ট থ্রেডের জন্য একাধিক ক্লাসে উপলব্ধ করে তোলে। এটি একাধিক ক্লাস জুড়ে সম্পর্কিত থ্রেড স্থানীয় ভেরিয়েবলগুলির একধরণের গ্লোবাল ভেরিয়েবল ডেকারেশন।
আমরা নিম্নলিখিত কোড নমুনা দিয়ে এই থ্রেড সুরক্ষা চেক করতে পারেন।
CurrentUser - থ্রেডলোকলে বর্তমান ব্যবহারকারীর আইডি সঞ্চয় করে
TestService- পদ্ধতি সহ সহজ পরিষেবা - getUser()কারেন্ট ইউজার থেকে বর্তমান ব্যবহারকারীর আনতে।
TestThread - এই শ্রেণিটি একাধিক থ্রেড তৈরি করতে ব্যবহার করে এবং একই সাথে ইউজারাইড সেট করে
।
public class CurrentUser
public class CurrentUser {
private static final ThreadLocal<String> CURRENT = new ThreadLocal<String>();
public static ThreadLocal<String> getCurrent() {
return CURRENT;
}
public static void setCurrent(String user) {
CURRENT.set(user);
}
}
public class TestService {
public String getUser() {
return CurrentUser.getCurrent().get();
}
}
।
import java.util.ArrayList;
import java.util.List;
public class TestThread {
public static void main(String[] args) {
List<Integer> integerList = new ArrayList<>();
//creates a List of 100 integers
for (int i = 0; i < 100; i++) {
integerList.add(i);
}
//parallel stream to test concurrent thread execution
integerList.parallelStream().forEach(intValue -> {
//All concurrent thread will set the user as "intValue"
CurrentUser.setCurrent("" + intValue);
//Thread creates a sample instance for TestService class
TestService testService = new TestService();
//Print the respective thread name along with "intValue" value and current user.
System.out.println("Start-"+Thread.currentThread().getName()+"->"+intValue + "->" + testService.getUser());
try {
//all concurrent thread will wait for 3 seconds
Thread.sleep(3000l);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//Print the respective thread name along with "intValue" value and current user.
System.out.println("End-"+Thread.currentThread().getName()+"->"+intValue + "->" + testService.getUser());
});
}
}
।
টেস্টথ্রেড মূল ক্লাস চালান। আউটপুট -
Start-main->62->62
Start-ForkJoinPool.commonPool-worker-2->31->31
Start-ForkJoinPool.commonPool-worker-3->81->81
Start-ForkJoinPool.commonPool-worker-1->87->87
End-main->62->62
End-ForkJoinPool.commonPool-worker-1->87->87
End-ForkJoinPool.commonPool-worker-2->31->31
End-ForkJoinPool.commonPool-worker-3->81->81
Start-ForkJoinPool.commonPool-worker-2->32->32
Start-ForkJoinPool.commonPool-worker-3->82->82
Start-ForkJoinPool.commonPool-worker-1->88->88
Start-main->63->63
End-ForkJoinPool.commonPool-worker-1->88->88
End-main->63->63
...
বিশ্লেষণের সারাংশ
- "মূল" থ্রেড শুরু হয় এবং বর্তমান ব্যবহারকারীকে "62" হিসাবে সেট করে, সমান্তরালভাবে "ফোর্কজাইনপুল ডটকমপুল-কর্মী -২" থ্রেড শুরু হয় এবং বর্তমান ব্যবহারকারীকে "31" হিসাবে সেট করে, সমান্তরালভাবে "ফোরকজাইনপুল.কম.পুল-কর্মী -৩" থ্রেড শুরু হয়ে বর্তমান সেট করে "81" হিসাবে ব্যবহারকারী সমান্তরালভাবে "ফোর্কজাইনপুল.কম.পুল-কর্মী -১" থ্রেড শুরু করে এবং বর্তমান ব্যবহারকারীকে "87" হিসাবে স্টার্ট-মেইন-> 62-> 62 স্টার্ট-ফর্কজইনপুল.কম.পুল-কর্মী -2-> 31-> 31 হিসাবে সেট করুন স্টার্ট-ফর্কজইনপুল.কম.পুল-কর্মী -3-> 81-> 81 স্টার্ট-ফর্কজইনপুল.কম.পুল-কর্মী -1-> 87-> 87
- এই উপরের সমস্ত থ্রেড 3 সেকেন্ডের জন্য ঘুমাবে
mainসম্পাদনা সমাপ্ত হয় এবং বর্তমান ব্যবহারকারীকে "62" হিসাবে মুদ্রণ করে, সমান্তরালভাবে ForkJoinPool.commonPool-worker-1নির্বাহ শেষ হয় এবং বর্তমান ব্যবহারকারীকে "87" হিসাবে মুদ্রণ করে, সমান্তরালভাবে ForkJoinPool.commonPool-worker-2নির্বাহ শেষ হয় এবং বর্তমান ব্যবহারকারীকে "31" হিসাবে মুদ্রণ করে, সমান্তরালভাবে ForkJoinPool.commonPool-worker-3কার্যকর হয় এবং বর্তমান ব্যবহারকারীটিকে "81" হিসাবে মুদ্রণ করে
অনুমান
সাম্প্রতিক থ্রেডগুলি "স্ট্যাটিক চূড়ান্ত থ্রেডলোকাল" হিসাবে ঘোষিত থাকলেও সঠিক ব্যবহারকারীর পুনরুদ্ধার করতে সক্ষম