Thread-safe

「スレッドセーフ」という保証は、具体的には何を保護しているか。

import java.util.*;
public class Main {
    static Vector<Object>    vec = new Vector<Object>();
    static ArrayList<Object> arr = new ArrayList<Object>();
    public static void main(String[] args) {
        new Thread(new Runnable() {
            public void run() {
                for (;;) {
                    vec.clear();
                    vec.addAll(arr);
                }
            }
        }).start();
        new Thread(new Runnable() {
            public void run() {
                for (;;) {
                    if (arr.size() > 10000)
                        arr.clear();
                    arr.add(new Object());
                }
            }
        }).start();
    }
}
public class Main {
    static StringBuffer buf1 = new StringBuffer(), 
                        buf2 = new StringBuffer();
    public static void main(String[] args) {
        new Thread(new Runnable() {
            public void run() {
                for (;;) {
                    buf1.setLength(0);
                    buf1.append(buf2);
                }
            }
        }).start();
        new Thread(new Runnable() {
            public void run() {
                for (;;) {
                    if (buf2.length() == 0)
                        buf2.append("hogehoge");
                    buf2.deleteCharAt(0);
                }
            }
        }).start();
    }
}

やはりマルチスレッドのプログラムは難しい。