Difference between Call by Name and Call by Value

object CallByNameValue extends App{
  def doSomething() = {
    println("do something...")
    1
  }

  def callByValue(x: Int){
    println("x1: "+x)
    println("x2: "+x)
  }

  def callByName(x: => Int){
    println("x1: "+x)
    println("x2: "+x)
  }

  println("======Call by Value======")
  callByValue(doSomething())

  println("======Call by Name======")
  callByName(doSomething())

}

Output

======Call by Value======
do something...
x1: 1
x2: 1
======Call by Name======
do something...
x1: 1
do something...
x2: 1