用了4个线程分别写一个数组的4个不同的部分,数组没加锁,请问这个操作是线程安全的吗?
既然是操作的数组不同部分,那就是线程安全的。相当于你一个数组分成了四个部分,分别由四个不同线程并发执行,不会存在线程之间共享数据的问题,所以是安全的。
我处理大批量数据业务时,有时也会采取这种方式,先将数据尽量均分成n份,然后交由n个线程并发执行,这样做节约了线程之间争用共享资源等待时的消耗,但同样会多消耗一定的内存空间,有得必有失嘛,相当于以空间换时间。
肯定不安全啊,同时操作数组,可能会导致线程死锁
首先,单从你说的这种情况来说,操作的是不同部分,只能说不会出现错误的情况。
但是多线程在设个数组上的访问肯定不能说是线程安全的,一旦有两个线程同时操作同一个地址的时候,就会出现数据不一致问题的。
//这是多线程的部分代码
AtomicInteger num = new AtomicInteger(0);
System.out.println("多线程计算方法实现!");
CountDownLatch countDownLatch = new CountDownLatch(4);
for(int i=1;i<=4;i++){
new Thread(new Runnable(){
public void run(){
int j = num.incrementAndGet();
int coodinate = 1+(j-1)*(TOTAL_COUNT/4);
while(coodinate<=j*(TOTAL_COUNT/4)){
HashMap mdfdb = dbSource.get(coodinate-1);
for(Map.Entry entry:mdfdb.entrySet()){
String s = entry.getKey();
if(mdff.containsKey(s)){
//对数组的操作,下标coodinate在不同的线程中,取值范围不同
euDistance[coodinate-1] += Math.pow((mdff.get(s)-entry.getValue()), 2);
}else{
matchNum[coodinate-1]--;
}
}
coodinate++;
}
countDownLatch.countDown();
}
}).start();
}
什么是线程安全什么是线程不安全呢?多个线程同时访问一个地址,肯定不安全
线程不安全:如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
http://wenwen.sogou.com/z/q745845951.htm
你看下
每个线程只访问固定的部分,不会交叉访问的话,个人认为是安全的。你这种情况等于每个线程都访问属于自己的变量。
如果能保证数组的的每个元素都只在同一线程被访问的话是安全的(注意添加和删除元素之后也要保证无误)。主要就要看你用什么方式把数组分成四个集合,每个集合里面的元素不会因为数组的操作跑到其他集合去
我觉得可以,但是也仅限于你仅仅是你说的这种操作,如果你一般读写,一遍for循环,或者是改变了数组的长度等等,就有可能出现问题,像你提问的这种情况,最典型的例子就是多线程下载,你可以去看看。
为啥不能单独操作数组,一个线程,一个数组,这样避免数据混乱。。
如果只做读取 修改不做删除 只要不改变数组结构 就是线程安全
谢谢