线程-线程安全
线程安全
一些线程安全的容器在复合操作下可能不是线程安全的
例:同步容器Vector
1.Vector这样的同步容器的所有公有方法全都是synchronized的,也就是说,我们可以在多线程场景中放心的使用【单独】这些方法,因为这些方法本身的确是线程安全的
2.由于,不同线程在同一时间操作同一个Vector,其中包括删除操作,那么就同样有可能发生线程安全问题。所以,在使用同步容器的时候,
如果涉及到多个线程同时执行删除操作,就要考虑下是否需要加锁。
3.最好使用其提供的复合的线程安全方法
解决思路
一些比较取巧的解决方法,比较理想化:
线程安全也可以指内存安全,目前主流操作系统都是多任务的,即多个进程同时运行。为了保证安全,每个进程只能访问分配给自己的内存空间,而不能访问别的进程的,这是由操作系统保障的
在每个进程的内存空间中都会有一块特殊的公共区域,通常称为堆(内存)。进程内的所有线程都可以访问到该区域,这就是造成问题的潜在原因。
例如,找个只有自己知道的地方藏起来,当然安全了如果一些数据只有某个线程会使用,其它线程不能操作也不需要操作,这些数据就可以放入线程的栈内存中。较为常见的就是局部变量
double avgScore(double[] scores) { /** * 这里的变量sum,count,avg都是局部变量,它们都会被分配在线程栈内存中 * 此解决方案是基于“位置”的。因为你放东西的“位置”只有你自己知道(或能到达),所以东西是安全的, * 因此这份安全是由“位置”来保障的 */ double sum = 0; for (double score : scores) { sum += score; } int count = scores.length; double avg = sum / count; return avg; }