JAvaスレッドにおける同期スレッドパケットの問題
従来のスレッド同期は、同期コードブロックまたは同期方法によって実現できることが知られている.
ここでは同期モニタの問題にかかわる.
同期モニタが知らないスレッドに関する知識を取得していない場合は、ブログを表示できます.http://blog.csdn.net/johnny901114/article/details/7536951
スレッド間の同期を確保するためには、モニタオブジェクトが同期スレッド間で同じオブジェクトであるため、同期反発効果を奏する.
したがって、メモリにはクラスのバイトコードが1つしか存在しないため、多くの人がバイトコード(class)を最も同期オブジェクトとして使用する.もちろん、これは同期関数のセットである.
関数のセットが複数ある場合は?複数のグループである以上、複数の同期モニタオブジェクトがある、同期モニタが同じクラスのバイトコードを使用すると、これは同期関数のセットとなる.
次の例では、2つの同期関数の最初の2つのスレッドがprint()を同期反発し、後の2つのスレッドがprintName()を同期反発する.つまり彼らの2組はそれぞれやっている.互いに影響しない.
print()とprintName()はstaticであり、synchronizedキーワード修飾もあるため、同期モニタオブジェクトは現在のクラスのバイトコードであるため、実際には同期関数のセットは2つのセットではなく、1つのセットしかありません.
出力結果から、1つのスレッドがprint()またはprintName()メソッドを実行する場合、他の3つのスレッドは、そのスレッドが実行するまで実行できないことがわかる.
複数のグループの場合、1つのグループの同期反発は他のグループの実行に影響しない.
出力結果が多いため貼り付けない.
print()とprintName()の2つの方法を変更すると、2つのグループが同期します.
出力結果から、2組の同期は互いに交互に実行することがわかる.
転載は出典を明記してください. http://blog.csdn.net/johnny901114/article/details/7854666
何か間違いがあったら指摘してください.ありがとうございます.
ここでは同期モニタの問題にかかわる.
同期モニタが知らないスレッドに関する知識を取得していない場合は、ブログを表示できます.http://blog.csdn.net/johnny901114/article/details/7536951
スレッド間の同期を確保するためには、モニタオブジェクトが同期スレッド間で同じオブジェクトであるため、同期反発効果を奏する.
したがって、メモリにはクラスのバイトコードが1つしか存在しないため、多くの人がバイトコード(class)を最も同期オブジェクトとして使用する.もちろん、これは同期関数のセットである.
関数のセットが複数ある場合は?複数のグループである以上、複数の同期モニタオブジェクトがある、同期モニタが同じクラスのバイトコードを使用すると、これは同期関数のセットとなる.
次の例では、2つの同期関数の最初の2つのスレッドがprint()を同期反発し、後の2つのスレッドがprintName()を同期反発する.つまり彼らの2組はそれぞれやっている.互いに影響しない.
public synchronized static void print() {
//synchronized (ThreadGroup.class) {
String source = " ";
char[] cs = source.toCharArray();
System.out.println(Thread.currentThread().getName());
for (int j = 0; j < 30; j++) {
System.out.println(j + " -----------------> ");
for (int i = 0; i < cs.length; i++) {
System.out.print(cs[i]);
}
System.out.println();
}
//}
}
public synchronized static void printName() {
//synchronized (String.class) {
System.out.println(Thread.currentThread().getName());
String source = " ";
char[] cs = source.toCharArray();
for (int j = 0; j < 30; j++) {
System.out.println(j+" -----------------> ");
for (int i = 0; i < cs.length; i++) {
System.out.print(cs[i]);
}
System.out.println();
}
//}
}
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
print();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
print();
}
}).start();
//--------------------------
new Thread(new Runnable() {
@Override
public void run() {
printName();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
printName();
}
}).start();
}
print()とprintName()はstaticであり、synchronizedキーワード修飾もあるため、同期モニタオブジェクトは現在のクラスのバイトコードであるため、実際には同期関数のセットは2つのセットではなく、1つのセットしかありません.
出力結果から、1つのスレッドがprint()またはprintName()メソッドを実行する場合、他の3つのスレッドは、そのスレッドが実行するまで実行できないことがわかる.
複数のグループの場合、1つのグループの同期反発は他のグループの実行に影響しない.
出力結果が多いため貼り付けない.
print()とprintName()の2つの方法を変更すると、2つのグループが同期します.
public static void print() {
synchronized (ThreadGroup.class) {
String source = " ";
char[] cs = source.toCharArray();
System.out.println(Thread.currentThread().getName());
for (int j = 0; j < 30; j++) {
System.out.println(j + " -----------------> ");
for (int i = 0; i < cs.length; i++) {
System.out.print(cs[i]);
}
System.out.println();
}
}
}
public static void printName() {
synchronized (String.class) {
System.out.println(Thread.currentThread().getName());
String source = " ";
char[] cs = source.toCharArray();
for (int j = 0; j < 30; j++) {
System.out.println(j+" -----------------> ");
for (int i = 0; i < cs.length; i++) {
System.out.print(cs[i]);
}
System.out.println();
}
}
}
出力結果から、2組の同期は互いに交互に実行することがわかる.
転載は出典を明記してください. http://blog.csdn.net/johnny901114/article/details/7854666
何か間違いがあったら指摘してください.ありがとうございます.