我可以使用bufferedwriter和线程安全在同一个套接字中写入吗?

时间:2018-06-18 16:09:39

标签: java bufferedwriter

我有一个客户端使用bufferedwriter在套接字中写入。但客户端创建一个可以使用相同缓冲区的线程。我没有使用锁定而且我的程序没有问题,但是如果客户端的主线程和客户端的线程在同一时间写入缓冲区的话,我有问题吗?

4 个答案:

答案 0 :(得分:1)

BufferedWriter's documentation没有描述其线程安全性; package-level documentation也没有说什么。

即使单个方法是以原子方式实现的,在编写器上调用多个方法肯定不是原子方法。

您应谨慎行事并假设它不是线程安全的,并在外部同步实例。没有错误表现出来的事实并不意味着错误。

答案 1 :(得分:1)

写入套接字不是原子操作。

最好使用syncrhonized方法来编写

更新

https://stackoverflow.com/a/1457347/5065312

  

所有版本的Unix和Windows都试图保持写入原子,但显然很少提供保证。

如果您使用的是实时内核,则写入不是原子的。

更新2:

IEEE Std 1003.1-2017 如果未指定写入套接字的字节数或写入套接字的字节数超过{PIPE_BUF},则不保证此写入是原子的。

有关详细信息,请参阅:man 7 pipe

PostData:在不控制流量的情况下同时写入是不好的做法。 99%可以工作,因为套接字输出有99%的时间是免费的

答案 2 :(得分:0)

从任何线程写入时,您必须在BufferedWriter中进行同步。即使这样,你也会在接收端遇到大量的问题,理解流,除非你的协议只包含行。

答案 3 :(得分:0)

这是您的问题的答案:如何使用正则表达式在两个字符之间获取字符串?

  

使用此:

$input = "hi my name [is] Mary [Poppins]";
$arr = explode(' ', $input);
$from = "[";
$to = "]";
function getStringBetween($input, $from, $to) {

    $sub = substr($input, strpos($input, $from) + strlen($from), strlen($input));

    return substr($sub, 0, strpos($sub, $to));
}


foreach ($arr as $data) {

    echo getStringBetween($data, $from, $to) . " ";  // is Poppins
}