001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.apache.commons.math3.random; 018 019 /** 020 * Any {@link RandomGenerator} implementation can be thread-safe if it 021 * is used through an instance of this class. 022 * This is achieved by enclosing calls to the methods of the actual 023 * generator inside the overridden {@code synchronized} methods of this 024 * class. 025 * 026 * @since 3.1 027 * @version $Id: SynchronizedRandomGenerator.java 1416643 2012-12-03 19:37:14Z tn $ 028 */ 029 public class SynchronizedRandomGenerator implements RandomGenerator { 030 /** Object to which all calls will be delegated. */ 031 private final RandomGenerator wrapped; 032 033 /** 034 * Creates a synchronized wrapper for the given {@code RandomGenerator} 035 * instance. 036 * 037 * @param rng Generator whose methods will be called through 038 * their corresponding overridden synchronized version. 039 * To ensure thread-safety, the wrapped generator <em>must</em> 040 * not be used directly. 041 */ 042 public SynchronizedRandomGenerator(RandomGenerator rng) { 043 wrapped = rng; 044 } 045 046 /** 047 * {@inheritDoc} 048 */ 049 public synchronized void setSeed(int seed) { 050 wrapped.setSeed(seed); 051 } 052 053 /** 054 * {@inheritDoc} 055 */ 056 public synchronized void setSeed(int[] seed) { 057 wrapped.setSeed(seed); 058 } 059 060 /** 061 * {@inheritDoc} 062 */ 063 public synchronized void setSeed(long seed) { 064 wrapped.setSeed(seed); 065 } 066 067 /** 068 * {@inheritDoc} 069 */ 070 public synchronized void nextBytes(byte[] bytes) { 071 wrapped.nextBytes(bytes); 072 } 073 074 /** 075 * {@inheritDoc} 076 */ 077 public synchronized int nextInt() { 078 return wrapped.nextInt(); 079 } 080 081 /** 082 * {@inheritDoc} 083 */ 084 public synchronized int nextInt(int n) { 085 return wrapped.nextInt(n); 086 } 087 088 /** 089 * {@inheritDoc} 090 */ 091 public synchronized long nextLong() { 092 return wrapped.nextLong(); 093 } 094 095 /** 096 * {@inheritDoc} 097 */ 098 public synchronized boolean nextBoolean() { 099 return wrapped.nextBoolean(); 100 } 101 102 /** 103 * {@inheritDoc} 104 */ 105 public synchronized float nextFloat() { 106 return wrapped.nextFloat(); 107 } 108 109 /** 110 * {@inheritDoc} 111 */ 112 public synchronized double nextDouble() { 113 return wrapped.nextDouble(); 114 } 115 116 /** 117 * {@inheritDoc} 118 */ 119 public synchronized double nextGaussian() { 120 return wrapped.nextGaussian(); 121 } 122 }