我写了一个脚本测试并发写入文件,发现虽然没有加锁,但是并发写入文件是没有失误的,就是所有的内容都会正常的依次写入,为什么没有造成因为没有加锁造成的数据不对的问题呢?
下面是我的代码
<pre>
package main
import (
"fmt"
bs "github.com/tgyf007/mypackage/binarytostring"
"os"
"sync"
"time"
)
var lo sync.Mutex
func main() {
start := time.Now()
ch := make(chan string)
for j := 0; j < 1; j++ {
for i := 97; i < 123; i++ {
go writetofile(i, ch)
}
}
for j := 0; j < 1; j++ {
for i := 97; i < 123; i++ {
fmt.Println(<-ch)
}
}
fmt.Printf("%.6fs\n", time.Since(start).Seconds())
}
func writetofile(i int, ch chan<- string) {
// lo.Lock()
// defer lo.Unlock()
str := bs.BuildString(i, 3)
bg := bs.BuildString(i-32, 3)
// log.SetOutput(os.Stdout)
// log.Println(str)
start := time.Now()
for i := 0; i < 5; i++ {
dst, err := os.OpenFile("./text.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND|os.O_SYNC, 0644)
_, err = dst.Write([]byte(str + time.Now().String() + "\n"))
dst1, err := os.OpenFile("./text.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND|os.O_SYNC, 0644)
_, err = dst1.Write([]byte(bg + time.Now().String() + "\n"))
if err != nil {
ch <- fmt.Sprint(err)
return
}
}
secs := time.Since(start).Seconds()
ch <- fmt.Sprintf("%.6f", secs)
// ch <- fmt.Sprintf("%.6f, %s", secs, str)
}
</code>
有疑问加站长微信联系(非本文作者)