記事のソースhttps://www.jianshu.com/p/b913e64db7ee
記事対応するビデオソース:https://developer.aliyun.com/course/1012?spm=5176.10731542.0.0.6ef2d290hxQ4g0
マルチスレッド処理の中で、あなたは誤った操作データを生成し、適切に処理されない場合は、複数のスレッドが同じリソースにアクセスすると、当然のことながら、各スレッドのオブジェクトを記述するリソースにRunnableを記述を操作する複数のスレッドを使用し、スレッドすることができます。
同期の問題につながります
簡単なプログラムは、現在のスレッドの数がチケットを販売する目的を達成するために業務を処理し、チケットを販売して書きます。
例:運用売りチケットを達成するために
class MyThread implements Runnable {
private int ticket = 10;//总票数为10张
@Override
public void run() {
while (true) {
if (this.ticket > 0) {
System.out.println(Thread.currentThread().getName() + "卖票,ticket = " + this.ticket--);
} else {
System.out.println("***** 票卖光了 *****");
break;
}
}
}
}
public class ThreadDemo {
public static void main(String[] args) throws Exception {
MyThread mt=new MyThread();
new Thread(mt,"票贩子A").start();
new Thread(mt,"票贩子B").start();
new Thread(mt,"票贩子C").start();
}
}
この時点で、プログラムは3個のスレッドオブジェクト、および10枚のチケットが販売されるこれらの3つのスレッドを作成します。このとき、処理手順は、時にチケットを行って、何の問題(アーティファクト)、以下の操作がチケットを遅らせるものをシミュレートすることができますがありません。
class MyThread implements Runnable {
private int ticket = 10;//总票数为10张
@Override
public void run() {
while (true) {
if (this.ticket > 0) {
try {
Thread.sleep(100);//模拟网络延迟
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "卖票,ticket = " + this.ticket--);
} else {
System.out.println("***** 票卖光了 *****");
break;
}
}
}
}
この時間遅延は問題が露出しているに追加され、実際には、この問題がでてきました。
スレッド同期
分析は、その後、次の同期の問題を解決する必要がある、同期の問題を生じているが、問題を解決するためのキーがロックにある、あるスレッドが操作、外部待ち他のスレッドを実行するための時間を参照した後に主な理由が決定され得ます。
プログラムロック機能を実現するために、同期メソッドを使用して、同期キーワードを吸収するために使用することができ、同期同期コードブロックを定義することができる、シンクブロック内のオペレーションコードが実行の唯一のスレッドを可能にします。
図1に示すように、以下の条件を使用して、同期コードブロック:
synchronized (同步对象){
同步代码操作;
}
オブジェクトは、同期処理が一般的である場合、同期が現在のオブジェクトにこれを使用して行うことができます。
例:同期データの同期コード・ブロックへのアクセスの問題が解決します
class MyThread implements Runnable {
private int ticket = 1000;//总票数为10张
@Override
public void run() {
while (true) {
synchronized (this) {//每一次只允许一个线程进行访问
if (this.ticket > 0) {
try {
Thread.sleep(100);//模拟网络延迟
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "卖票,ticket = " + this.ticket--);
} else {
System.out.println("***** 票卖光了 *****");
break;
}
}
}
}
}
public class ThreadDemo {
public static void main(String[] args) throws Exception {
MyThread mt = new MyThread();
new Thread(mt, "票贩子A").start();
new Thread(mt, "票贩子B").start();
new Thread(mt, "票贩子C").start();
}
}
同期プロセスを加えた後、プログラムの全体的なパフォーマンスが低下しました。同期は実際にパフォーマンスが低下します。
図2に示すように、解決するための同期方法を使用して:ちょうど同期キーワードを使用する方法で定義することができます。
class MyThread implements Runnable {
private int ticket = 10;//总票数为10张
public synchronized boolean sale() {
if (this.ticket > 0) {
try {
Thread.sleep(100);//模拟网络延迟
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "卖票,ticket = " + this.ticket--);
return true;
} else {
System.out.println("***** 票卖光了 *****");
return false;
}
}
@Override
public void run() {
while (this.sale()) {}
}
}
public class ThreadDemo {
public static void main(String[] args) throws Exception {
MyThread mt = new MyThread();
new Thread(mt, "票贩子A").start();
new Thread(mt, "票贩子B").start();
new Thread(mt, "票贩子C").start();
}
}
Javaクラスライブラリを学ぶ将来的には、それは多くのクラスで使用される同期方法が使用する同期処理システムです。
デッドロック
デッドロックが発生する可能性があるという問題がある同期マルチスレッド進行中である、いわゆるデッドロックがお互いの状態を待っているスレッドの数を指します。
public class DeadLock implements Runnable {
private Producer producer = new Producer();
private Customer customer = new Customer();
public DeadLock() {
new Thread(this).start();
customer.say(producer);
}
public static void main(String[] args) {
new DeadLock();
}
@Override
public void run() {
producer.say(customer);
}
}
class Producer {
public synchronized void say(Customer customer) {
System.out.println("店员:先买单后吃饭");
customer.get();
}
public synchronized void get() {
System.out.println("收到钱,可以给你做饭了");
}
}
class Customer {
public synchronized void say(Producer producer) {
System.out.println("顾客:先吃饭后买单");
producer.get();
}
public synchronized void get() {
System.out.println("吃饱饭了,可以买单了");
}
}
現在のデッドロックは、他のリソースを出すのを待って、お互いのためにすべての待機が発生したため主な理由です。デッドロックが表示されますが、時には、コードが適切に処理されていない、それは時間の正常な発達をデバッグする問題であり、時間のデッドロックになることを実際に開発の不確実な状態です。
スレッドの数が同じリソースにアクセスしたときに同期するようにしてください、あまりにも多くの同期デッドロックの原因となります。