先上测试代码吧。
var fs = require('fs'); var i = 0; fs.writeFile('./json'+i+'.json', 1,function(err){ if(err) console.log('写文件操作失败'); else console.log('写文件操作成功 -1'); }); //i++; fs.writeFile('./json'+i+'.json', 111,function(err){ if(err) console.log('写文件操作失败'); else console.log('写文件操作成功-2'); }); //i++;
fs.writeFile('./json'+i+'.json', 11111,function(err){ if(err) console.log('写文件操作失败'); else console.log('写文件操作成功-3'); }); //i++;
fs.writeFile('./json'+i+'.json', 1111111,function(err){ if(err) console.log('写文件操作失败'); else console.log('写文件操作成功-4'); }); //i++;
fs.writeFile('./json'+i+'.json', 111111111,function(err){ if(err) console.log('写文件操作失败'); else console.log('写文件操作成功-5'); }); //i++;
fs.writeFile('./json'+i+'.json', 222222222222,function(err){ if(err) console.log('写文件操作失败-6'); else console.log('写文件操作成功-6'); });
同时发起六个写文件的操作,文件名称相同,也就是往同一个文件里面写数据。 如果是单线程的话,那么是一个一个顺序执行, 先执行第一个,把“1”写进去, 然后执行第二个,把“111”写进去,同时覆盖上一次的操作“1” 然后执行第三个,以此类推,最后文件里面剩下的只有“222222222222”。
但是多次运行之后,结果很诡异。有时候文件里是“222222222222”,有的时候是“1”,这个可以理解为“入栈”的先后顺序不一致。
但是有一次,文件内容是“111111122222”,还有一次内容是“111111111222”。
这是什么鬼?这是哪来的?如果是单线程,一次只执行一个写入操作,内容绝对不会乱,会覆盖在意料之中。
难道是传说中的“线程不安全”,但是node不是单线程的吗?
难道六个写入操作,是同时进行的吗?而且还互相影响?!