线程-线程安全

线程安全

一些线程安全的容器在复合操作下可能不是线程安全的

例:同步容器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;
    }

 

posted @ 2023-11-26 23:29  轻寒  阅读(4)  评论(0编辑  收藏  举报