JAvaマルチスレッド同時問題スレッド同期
3392 ワード
マルチスレッドの同時処理:
1.スレッドに同時に問題が発生:
1.複数のスレッドは、同じリソースにアクセスする必要があります(データが混乱しています).
2.マルチスレッド操作の場合、タイムスライスの原因により、一定の論理を持つコードの一部が2つのタイムスライスによって実行される可能性がある(順序が混乱している).
2.スレッド同時問題処理:鍵はロックの使用にある.
1.スレッドの同時処理は、スレッドロックによって処理される.
スレッドの同期、スレッドの待機は、実際にはスレッドロックに対する2つの異なる動作である.
2.スレッドロック:オブジェクト(クラス内のプロパティ)です.
1.各クラスには、スレッドロック(クラスロック)(静的メンバー)が付属します.
2.各オブジェクトには、スレッドロック(オブジェクトロック)(ダイナミックメンバー)が付属します.
3.スレッドロックをカスタマイズします.
3.スレッドの同時処理:
1.スレッドの同期操作とスレッドの待機操作は、システムがクラスロックまたはオブジェクトロックと組み合わせて実現する.
1.スレッドの同期実装:どのロックがロックされ、そのスレッドがブロックされているか.
1.同期関数:関数を定義するときに、スレッド同期キーワードsynchronizedを追加します.public synchronized void aa(){}
1.関数が静的関数の場合、システムは自動的にクラスロック(その関数が存在するクラスのクラスロック)を使用します.
2.関数がダイナミック関数の場合、オブジェクトロック(ダイナミック関数を呼び出すときにそのオブジェクトを介して呼び出される関数)が自動的に使用されます.
2.同期コード:対応する実行コードに同期文synchronized(ロック){同期が必要なコード}を入れる
同期操作を実行するときに、使用するロックを指定します.
以下にいくつかの例を示します.
runメソッドにロックをかけます.このロックは実際にはオブジェクトロックです.
オブジェクトロックを使用する場合、上の図に示すように、各スレッドをロックするrunメソッドはプログラムに影響を与えることはできません.ロック後、最初のスレッドのrが実行されるまで待たなければならないのではなく、次のスレッドが開始します.彼は本質的にrunの内容をsynchronized(this){}で包むのと同じです. いずれもオブジェクトロックを使用していますが、下を見てください
この方法を使用すると、追加されたロックはクラスロックである.4つの新しいスレッドはクラスロックが付いているため、1つのスレッドしか実行できません.他のスレッドはブロックされています.このスレッドの実行が完了するまで、次のスレッドが開始されません.
スレッド同期はcpu実行の効率に影響するので、加算しないでできるだけ加算しないで、
1.複数のスレッドは、同じリソースにアクセスする必要があります(データが混乱しています).
2.マルチスレッド操作の場合、タイムスライスの原因により、一定の論理を持つコードの一部が2つのタイムスライスによって実行される可能性がある(順序が混乱している).
者2の場合は必ず鍵をかけ、できるだけ少ない文につける
1.スレッドに同時に問題が発生:
1.複数のスレッドは、同じリソースにアクセスする必要があります(データが混乱しています).
2.マルチスレッド操作の場合、タイムスライスの原因により、一定の論理を持つコードの一部が2つのタイムスライスによって実行される可能性がある(順序が混乱している).
2.スレッド同時問題処理:鍵はロックの使用にある.
1.スレッドの同時処理は、スレッドロックによって処理される.
スレッドの同期、スレッドの待機は、実際にはスレッドロックに対する2つの異なる動作である.
2.スレッドロック:オブジェクト(クラス内のプロパティ)です.
1.各クラスには、スレッドロック(クラスロック)(静的メンバー)が付属します.
2.各オブジェクトには、スレッドロック(オブジェクトロック)(ダイナミックメンバー)が付属します.
3.スレッドロックをカスタマイズします.
3.スレッドの同時処理:
1.スレッドの同期操作とスレッドの待機操作は、システムがクラスロックまたはオブジェクトロックと組み合わせて実現する.
1.スレッドの同期実装:どのロックがロックされ、そのスレッドがブロックされているか.
1.同期関数:関数を定義するときに、スレッド同期キーワードsynchronizedを追加します.public synchronized void aa(){}
1.関数が静的関数の場合、システムは自動的にクラスロック(その関数が存在するクラスのクラスロック)を使用します.
2.関数がダイナミック関数の場合、オブジェクトロック(ダイナミック関数を呼び出すときにそのオブジェクトを介して呼び出される関数)が自動的に使用されます.
2.同期コード:対応する実行コードに同期文synchronized(ロック){同期が必要なコード}を入れる
同期操作を実行するときに、使用するロックを指定します.
以下にいくつかの例を示します.
runメソッドにロックをかけます.このロックは実際にはオブジェクトロックです.
package com.lmc.main;
public class MyRunnable implements Runnable{
@Override
public synchronized void run() {
// TODO Auto-generated method stub
for(int i = 0 ; i < 10 ; i++){
System.out.println(Thread.currentThread().getName()+" "+i+" ");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
package com.lmc.main;
public class Main {
public static void main(String[] args) {
new Thread(new MyRunnable()," 1").start();
new Thread(new MyRunnable()," 2").start();
new Thread(new MyRunnable()," 3").start();
new Thread(new MyRunnable()," 3").start();
}
}
オブジェクトロックを使用する場合、上の図に示すように、各スレッドをロックするrunメソッドはプログラムに影響を与えることはできません.ロック後、最初のスレッドのrが実行されるまで待たなければならないのではなく、次のスレッドが開始します.彼は本質的にrunの内容をsynchronized(this){}で包むのと同じです. いずれもオブジェクトロックを使用していますが、下を見てください
package com.lmc.main;
public class MyRunnable implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
synchronized (MyRunnable.class) {
for(int i = 0 ; i < 10 ; i++){
System.out.println(Thread.currentThread().getName()+" "+i+" ");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
この方法を使用すると、追加されたロックはクラスロックである.4つの新しいスレッドはクラスロックが付いているため、1つのスレッドしか実行できません.他のスレッドはブロックされています.このスレッドの実行が完了するまで、次のスレッドが開始されません.
1 0
1 1
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
3 0
3 1
3 2
3 3
3 4
3 5
3 6
3 7
3 8
3 9
3 0
3 1
3 2
3 3
3 4
3 5
3 6
3 7
3 8
3 9
2 0
2 1
2 2
2 3
2 4
2 5
2 6
2 7
2 8
2 9
スレッド同期はcpu実行の効率に影響するので、加算しないでできるだけ加算しないで、
1.複数のスレッドは、同じリソースにアクセスする必要があります(データが混乱しています).
2.マルチスレッド操作の場合、タイムスライスの原因により、一定の論理を持つコードの一部が2つのタイムスライスによって実行される可能性がある(順序が混乱している).
者2の場合は必ず鍵をかけ、できるだけ少ない文につける