如何使用concurrent保证线程安全

这段时间在搞增值平台的开发,其中在短信平台的核心层,有一个Socket Server,一个Socket Client,用server接收数据包,多线程写入缓存文件中(针对一个客户端,启动一个线程),然后再用另一个多线程程序来读缓存文件,把重新组织数据包,并发往移动的网关。

就是由于不管进行读文件,还是写文件,程序里肯定要对文件先加锁再操作的,但由于是多线程读文件,多线程写文件,同时进行,两个程序要抢锁。而写文件的速度远远大于读文件的速度,我遇到的问题数据包不完整。我认为是一是由于线程不安全的原因。还有一个原因是,我用的文件加锁是用FileLock加的锁。在用Java.nio.FileChunnal,和FileLock给文件加锁时,要根据操作系统来调整程序的。因为,我用Linux操作系统,Linux操作系统中的锁默认的是劝告式的锁,而Windows的锁是强制性的锁。由于LINUX的锁是劝告式的,所以并不能根本锁住一个文件。

由于以上的原因,我的程序的错误是,单线程运行程序没有任何问题,在LINUX上多线程运行时就会出现问题了,造成数据包不完整的情况。

基于上述原因,我通过其它人了解到了concurrent这个包。于是就试了一下,结果效果还真不错。因为这个包里有一个文件读写的接口,用这个接口实现一个读写的类。不管是读文件还是写文件,我首先要先获取一个读写锁,并把它放在静态变量中,并保证读写都用一个锁。然后在读文件时,我获取读请求,再进行读文件,写文件时,我先获取一个写请求,然后再写文件。这样一改,我的程序就不再出现数据包不完整的现象了。嘿嘿。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值