1/*
2 * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/*
25 * @test
26 * @summary Basic functional test of ThreadLocal
27 * @author Josh Bloch
28 */
29
30public class Basic {
31    static ThreadLocal n = new ThreadLocal() {
32        int i = 0;
33        protected synchronized Object initialValue() {
34            return new Integer(i++);
35        }
36    };
37
38    public static void main(String args[]) throws Exception {
39        int threadCount = 100;
40        Thread th[] = new Thread[threadCount];
41        final int x[] = new int[threadCount];
42
43        // Start the threads
44        for(int i=0; i<threadCount; i++) {
45            th[i] = new Thread() {
46                public void run() {
47                    int threadId = ((Integer)(n.get())).intValue();
48                    for (int j=0; j<threadId; j++) {
49                        x[threadId]++;
50                        Thread.currentThread().yield();
51                    }
52                }
53            };
54            th[i].start();
55        }
56
57        // Wait for the threads to finish
58        for(int i=0; i<threadCount; i++)
59            th[i].join();
60
61        // Check results
62        for(int i=0; i<threadCount; i++)
63            if (x[i] != i)
64                throw(new Exception("x[" + i + "] =" + x[i]));
65    }
66}
67