/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicLong; /** * Test for Jit regressions. */ public class Main { public static void main(String args[]) throws Exception { b17689750TestVolatile(); b17689750TestMonitor(); } static void b17689750TestVolatile() { final B17689750TestVolatile test = new B17689750TestVolatile(); new Thread() { public void run() { test.thread1(); } }.start(); try { test.thread2(); } catch (NullPointerException expected) { System.out.println("b17689750TestVolatile passed."); } } static void b17689750TestMonitor() { final B17689750TestMonitor test = new B17689750TestMonitor(); new Thread() { public void run() { test.thread1(); } }.start(); try { test.thread2(); } catch (NullPointerException expected) { System.out.println("b17689750TestMonitor passed."); } } } class B17689750TestVolatile { private volatile int state = 0; private int[] values = { 42 }; void thread1() { while (state != 1) { } // Busy loop. values = null; state = 2; } void thread2() { int[] vs1 = values; state = 1; while (state != 2) { } // Busy loop. int[] vs2 = values; int v1 = vs1[0]; int v2 = vs2[0]; System.out.println("b17689750TestVolatile failed: " + v1 + ", " + v2); } } class B17689750TestMonitor { private int state = 0; private Object lock = new Object(); private int[] values = { 42 }; void thread1() { int s; do { synchronized (lock) { s = state; } } while (s != 1); // Busy loop. synchronized (lock) { values = null; state = 2; } } void thread2() { int[] vs1; synchronized (lock) { vs1 = values; state = 1; } int s; do { synchronized (lock) { s = state; } } while (s != 2); // Busy loop. int[] vs2 = values; int v1 = vs1[0]; int v2 = vs2[0]; System.out.println("b17689750TestMonitor failed: " + v1 + ", " + v2); } }