2017-07-05 53 views
0

在这个例子中,我有一个竞争条件,在节目结束的字符串s应该@#打印代替:测序期货,以避免竞争条件

object TestFutures extends App { 

    var s = "THIS IS A STRING" 

    val f0 = Future { 0 } 
    val f1 = Future { 1 } 
    val fx = Seq(f0,f1) 

    fx.map { 
    seq => seq.map { i => 
      println("BEFORE ---> " + s) 
      if (i == 0) 
       s = s.replace ("T", "@") 
      else 
       s = s.replace ("I", "#") 
      println("AFTER ---> " + s) 
     } 
    } 


    Thread.sleep(5000) 
} 

但代码打印

BEFORE ---> THIS IS A STRING 
BEFORE ---> THIS IS A STRING 
AFTER ---> TH#S #S A STR#NG 
AFTER ---> TH#S #S A STR#NG 

如何避免这种竞争条件?如何更改字符串?

回答

1

避免竞态条件的唯一可靠方法是不具有可变状态。 像这样的东西可以工作:

val s = "THIS IS A STRING" 
Future 
    .sequence(Seq(Future(0), Future(1))) 
    .map { 
     _.foldLeft(s) { 
     case (s, 0) => s.replaceAll("T", "@") 
     case (s, _) => s.replaceAll("I", "#") 
    } 
    }.andThen { 
    case Success(str) => println("RESULT: " + str) 
    }