原文:https://www.cnblogs.com/lixinjie/p/10817860.html,讲得很通俗易懂。
我从文中学到的几点(线程安全方面):
在多线程环境中,存在于堆内存的公共资源可以被很多线程访问,也就存在安全隐患(数据容易被修改)。
所以,为了保障数据的安全,就要对这些数据做些处理。
一、从变量上着手:
方法一:将变量放在方法中,也就是局部变量【操作系统会为每个线程分配属于它自己的内存空间,通常称为栈内存,其它线程无权访问,而局部变量在栈内存中】
double avgScore(double[] scores) { double sum = 0; for (double score : scores) { sum += score; } int count = scores.length; double avg = sum / count; return avg; }
方法二:变量在类中的方法外 ,即成员变量,这时可以利用ThreadLocal【原理:多个线程访问同一共享变量时,ThreadLocal类为每个线程提供一份该变量的副本,各个线程拥有一份属于自己的变量副本,操作修改的是各自的变量副本,而不会相互影响。】
class StudentAssistant { ThreadLocal<String> realName = new ThreadLocal<>(); ThreadLocal<Double> totalScore = new ThreadLocal<>(); String determineDegree() { double score = totalScore.get(); if (score >= 90) { return "A"; } if (score >= 80) { return "B"; } if (score >= 70) { return "C"; } if (score >= 60) { return "D"; } return "E"; } double determineOptionalcourseScore() { double score = totalScore.get(); if (score >= 90) { return 10; } if (score >= 80) { return 20; } if (score >= 70) { return 30; } if (score >= 60) { return 40; } return 60; } }