staticメソッドのSynchronizedについて 2019/5
以下のSyncTest1クラス内のstaic synchronizedであるone, two, three3つのメソッドは、同時には実行されず、必ず一つづつ実行される。
上記のsynchnorizedメソッドは、以下のように書くのと同じ同期の効果が得られる。
ちなみに、synchronized(Class.forName("SyncTest1"))は、synchronized(Class.forName("SyncTest1"), true, currentLoader)と書くのと同義。
以下のSyncTest1クラス内のstaic synchronizedであるone, two, three3つのメソッドは、同時には実行されず、必ず一つづつ実行される。
public class SyncTest1 {
static synchronized void one() {
for (int i = 1; i <= 1000000; i++) {
System.out.print("1");
if (i % 100 == 0) System.out.println();
}
}
static synchronized void two() {
for (int i = 1; i <= 1000000; i++) {
System.out.print("2");
if (i % 100 == 0) System.out.println();
}
}
static synchronized void three() {
for (int i = 1; i <= 1000000; i++) {
System.out.print("3");
if (i % 100 == 0) System.out.println();
}
}
public static void main(String[] args) {
long lStart = System.nanoTime();
ExecuteOne exeOne = new ExecuteOne();
ExecuteTwo exeTwo = new ExecuteTwo();
ExecuteThree exeThree = new ExecuteThree();
exeOne.start();
exeTwo.start();
exeThree.start();
try {
exeOne.join();
exeTwo.join();
exeThree.join();
}
catch (InterruptedException ie) {
ie.printStackTrace();
}
System.out.println(System.nanoTime() - lStart);
}
}
class ExecuteOne extends Thread {
public void run() {
SyncTest1.one();
}
}
class ExecuteTwo extends Thread {
public void run() {
SyncTest1.two();
}
}
class ExecuteThree extends Thread {
public void run() {
SyncTest1.three();
}
}
上記のsynchnorizedメソッドは、以下のように書くのと同じ同期の効果が得られる。
public class SyncTest1 {
static void one() {
synchronized(Class.forName("SyncTest1")) {
for (int i = 1; i <= 1000000; i++) {
System.out.print("1");
if (i % 100 == 0) System.out.println();
}
}
}
static void two() {
synchronized(Class.forName("SyncTest1")) {
for (int i = 1; i <= 1000000; i++) {
System.out.print("2");
if (i % 100 == 0) System.out.println();
}
}
}
static void three() {
synchronized(Class.forName("SyncTest1")) {
for (int i = 1; i <= 1000000; i++) {
System.out.print("3");
if (i % 100 == 0) System.out.println();
}
}
}
...
メソッド単位で同期をとるのではなくて、staticクラス単位で同期をとるということ。ちなみに、synchronized(Class.forName("SyncTest1"))は、synchronized(Class.forName("SyncTest1"), true, currentLoader)と書くのと同義。