diff --git a/scala_project_2025/part1/src/main/scala/Main.scala b/scala_project_2025/part1/src/main/scala/Main.scala index 7096b9d..e7ecc00 100644 --- a/scala_project_2025/part1/src/main/scala/Main.scala +++ b/scala_project_2025/part1/src/main/scala/Main.scala @@ -43,3 +43,7 @@ def quadratic(a: Double, b: Double, c: Double): Option[(Double, Double)] = // task 2 a) def polynomial(a: Double, b: Double, c: Double): Double => Double = (x: Double) => a * x * x + b * x + c + +// task 3 a) +def initialize_thread(execute: () => Unit): Thread = + new Thread { override def run = execute() } diff --git a/scala_project_2025/part1/src/main/scala/conc/ConcurrencyTroubles.scala b/scala_project_2025/part1/src/main/scala/conc/ConcurrencyTroubles.scala new file mode 100644 index 0000000..7d2de37 --- /dev/null +++ b/scala_project_2025/part1/src/main/scala/conc/ConcurrencyTroubles.scala @@ -0,0 +1,52 @@ +package example + +import scala.concurrent.Future +import scala.concurrent.ExecutionContext.Implicits.global +import scala.concurrent.Await +import scala.concurrent.duration.Duration + +object ConcurrencyTroubles { + private var value1: Int = 1000 + private var value2: Int = 0 + private var sum: Int = 0 + + def moveOneUnit(): Unit = { + value1 -= 1 + value2 += 1 + if (value1 == 0) { + value1 = 1000 + value2 = 0 + } + } + + def updateSum(): Unit = { + sum = value1 + value2 + } + + def execute(): Unit = { + while (true) { + this.synchronized { + moveOneUnit() + updateSum() + } + Thread.sleep(50) + } + } + + // This is the "main" method, the entry point of execution. + // It could have been placed in a different file. + def main(args: Array[String]): Unit = { + for (i <- 1 to 2) { + val thread = new Thread { + override def run = execute() + } + thread.start() + } + + while (true) { + updateSum() + println(sum + " [" + value1 + " " + value2 + "]") + Thread.sleep(100) + } + } +}