Machine-translated by Google. Questions are authored in English.
Top

Discussion

Sample41 is run - what will be the output?

public class Sample41
{
    static final StringBuilder LOG = new StringBuilder();

    public static void main(String[] args) throws InterruptedException
    {
        Runnable job = () -> { for (int i = 0; i < 1000; i++) LOG.append('x'); };
        Thread a = new Thread(job), b = new Thread(job);
        a.start(); b.start(); a.join(); b.join();
        System.out.println(LOG.length());
    }
}

  • A.An unpredictable length, or an exception, because StringBuilder is not synchronized
  • B.Exactly 2000, because both joins complete before the print
  • C.Exactly 1000, because the two threads write the same characters
  • D.A compile error, because LOG must be volatile

Answer: A

StringBuilder makes no attempt at thread safety, so two threads appending concurrently can corrupt its internal length and array; the result may be short, or an ArrayIndexOutOfBoundsException from inside append. The joins order the print but cannot repair the damage. StringBuffer, or a lock, is what makes it safe.

No comment is present. Be the first to comment.
Loading…

Post your comment

Please log in or register to post a comment.