目次
同期
前書き
线程同步方法
线程同步块
详细原因
注意
スレッド同期メソッド
出力結果は以下の通りです
スレッド同期ブロック
詳しい理由
ホームページ Java &#&チュートリアル 同期とは何ですか?同期の使い方は?

同期とは何ですか?同期の使い方は?

Jun 21, 2017 pm 01:27 PM
synchronized

同期

前書き

オペレーティング システムを学習するとき、1 つのナレッジ ポイントは一度に 1 つのプロセスでのみ操作できるリソースです。マルチスレッドは同時に動作し、同時に 1 つのリソースのみのアクセスと変更を制御することはできません。今日は、最初の方法であるスレッド同期ブロックまたはスレッド同期について説明します。メソッド (同期)

  1. 次は、synchronized キーワードの使用例を示しますsynchronized关键字的使用

线程同步方法

public class Sychor {public void insert(Thread thread) {for (int i = 0; i < 10; i++) {
            System.out.println(thread.getName() + "输出:  " + i);
        }

    }public static void main(String[] args) {final Sychor sychor = new Sychor();

        Thread t1 = new Thread() {public void run() {
                sychor.insert(Thread.currentThread());
            };
        };

        Thread t2 = new Thread() {public void run() {
                sychor.insert(Thread.currentThread());
            };
        };

        t1.start();
        t2.start();
    }
}
ログイン後にコピー

其中输出结果为下图

同期とは何ですか?同期の使い方は?

从上面的结果可以看出这里的两个线程是同时执行insert()方法的,下面我们在原有的代码上添加synchronized关键字看看效果如何,代码如下:

public class Sychor {public synchronized void insert(Thread thread) {for (int i = 0; i < 10; i++) {
            System.out.println(thread.getName() + "输出:  " + i);
        }

    }public static void main(String[] args) {final Sychor sychor = new Sychor();

        Thread t1 = new Thread() {public void run() {
                sychor.insert(Thread.currentThread());
            };
        };

        Thread t2 = new Thread() {public void run() {
                sychor.insert(Thread.currentThread());
            };
        };

        t1.start();
        t2.start();
    }
}
ログイン後にコピー

上面程序的同期とは何ですか?同期の使い方は?我就不列出来,自己可以试试,总之就是加上了synchronized关键字使得线程是一个一个的执行的,只有先执行完一个线程才能执行了另外一个线程。

线程同步块

当然上面的我们使用的是线程同步方法,我们可以使用线程同步块,这两个相比线程同步块更加灵活,只需要将需要同步的代码放在同步块中即可,代码如下;

public class Sychor {public void insert(Thread thread) {synchronized (this) {for (int i = 0; i < 10; i++) {
                System.out.println(thread.getName() + "输出:  " + i);
            }
            
        }
        

    }public static void main(String[] args) {final Sychor sychor = new Sychor();

        Thread t1 = new Thread() {public void run() {
                sychor.insert(Thread.currentThread());
            };
        };

        Thread t2 = new Thread() {public void run() {
                sychor.insert(Thread.currentThread());
            };
        };

        t1.start();
        t2.start();
    }
}
ログイン後にコピー

从上面的代码中可以看出这种方式更加灵活,只需要将需要同步的代码方法在同步块中,不需要同步的代码放在外面

详细原因

  1. 我们知道每一个对象都有一把锁,当我们使用线程同步方法或者线程同步块的时候实际上获得是对象的唯一的一把锁,当一个线程获得了这唯一的锁,那么其他的线程只能拒之门外了,注意这里我们说是一个对象,也就是说是同一个对象,如果是不同的对象,那么就不起作用了,因为不同对象有不同的对象锁,比如我们将上面的程序改成如下:

public class Sychor {public void insert(Thread thread) {synchronized (this) {for (int i = 0; i < 10; i++) {
                System.out.println(thread.getName() + "输出:  " + i);
            }
        }

    }public static void main(String[] args) {//第一个线程Thread t1 = new Thread() {public void run() {
                Sychor sychor = new Sychor();   //在run() 方法中创建一个对象sychor.insert(Thread.currentThread());
            };
        };//第二个线程Thread t2 = new Thread() {public void run() {
                Sychor sychor = new Sychor();  //创建另外的一个对象sychor.insert(Thread.currentThread());
            };
        };

        t1.start();
        t2.start();
    }
}
ログイン後にコピー

从上面的结果可知,此时线程同步块根本不起作用,因为他们调用的是不同对象的insert方法,获得锁是不一样的

  1. 上面我们已经说过一个对象有一把锁,线程同步方法和线程同步块实际获得的是对象的锁,因此线程同步块的括号中填入的是this,我们都知道this在一个类中的含义

  1. 一个类也有唯一的一把锁,我们前面说的是使用对象调用成员方法,现在如果我们要调用类中的静态方法,那么我们可以使用线程同步方法或者同步块获得类中的唯一一把锁,那么对于多个线程同时调用同一个类中的静态方法就可以实现控制了,代码如下:

public class Sychor {// 静态方法public static synchronized void insert(Thread thread)  
    {for(int i=0;i<10;i++)
        {
            System.out.println(thread.getName()+"输出     "+i);
        }
    }public static void main(String[] args) {//第一个线程Thread t1 = new Thread() {public void run() {
                Sychor.insert(Thread.currentThread());  //直接使用类调用静态方法};
        };//第二个线程Thread t2 = new Thread() {public void run() {
                Sychor.insert(Thread.currentThread());   //直接使用类调用静态方法};
        };

        t1.start();
        t2.start();
    }
}
ログイン後にコピー

注意

  1. 要想实现线程安全和同步控制,如果执行的是非static同步方法或者其中的同步块,那么一定要使用同一个对象,如果调用的是static同步方法或者其中的同步块那么一定要使用同一个类去调用

  1. 如果一个线程访问的是static同步方法,而另外一个线程访问的是非static的同步方法,此时这两个是不会发生冲突的,因为一个是类的锁,一个是对象的锁

  1. 如果使用线程同步块,那么同步块中的代码是控制访问的,但是外面的代码是所有线程都可以访问的

  1. 当一个正在执行同步代码块的线程出现了异常,那么jvm

スレッド同期メソッド

rrreee

出力結果は以下の通りです

同期とは何ですか?同期の使い方は?

上記の結果から、ここの 2 つのスレッドが insert() メソッドを同時に実行していることがわかります。次に、synchronized を元のコードに追加します。 code> キーワードを使用して効果を確認します。コードは次のとおりです。🎜🎜
rrreee
🎜🎜 実行中のコードはリストしません。上記のプログラムの結果は、自分で試すことができます。つまり、 synchronized キーワードを使用すると、スレッドが 1 つずつ実行され、最初に 1 つのスレッドが実行された場合にのみ、別のスレッドが実行されます。 🎜🎜

スレッド同期ブロック

🎜🎜 もちろん、上記のスレッド同期メソッドを使用しましたが、スレッド同期ブロックを使用することもできます。これら 2 つはスレッド同期ブロックよりも柔軟で、同期する必要があるコードのみが必要です。同期ブロックに置くだけです。コードは次のとおりです。 🎜🎜
rrreee
🎜🎜 上記のコードからわかるように、このメソッドはより柔軟です。同期する必要があるコードメソッドを追加します。同期ブロック内で、同期する必要のないコードが外側に配置されます。🎜🎜

詳しい理由

🎜🎜🎜🎜各オブジェクトが存在することがわかります。スレッド同期を使用する場合、 ロックがあります。 メソッドまたはスレッドがブロックを同期するとき、実際にはオブジェクトの唯一のロックを取得します。スレッドがこの一意のロックを取得すると、他のスレッドはシャットアウトされるだけであることに注意してください。ここでは、それがオブジェクトであると言い、つまり、それが異なるオブジェクトである場合、異なるオブジェクトは異なるオブジェクトロックを持っているため、機能しません。 たとえば、上記のプログラムを次のように変更します。以下: 🎜🎜🎜🎜
rrreee
🎜🎜上記の結果から、スレッド同期ブロックは現時点ではまったく機能していないことがわかります。これは、スレッド同期ブロックが次の挿入メソッドを呼び出しているためです。 異なるオブジェクトであり、ロックの取得も異なります🎜🎜 🎜🎜🎜🎜 オブジェクトがロックを持っていると上で述べましたが、スレッド同期メソッドとスレッド同期ブロックは実際にオブジェクトのロックを取得します。スレッド同期ブロックの括弧内は this で埋められています。クラス内の this の意味は誰もが知っています🎜🎜🎜🎜🎜🎜🎜クラスには次のようなものもあります。ユニークなロック。先ほど説明したのは、オブジェクトを使用してメンバーのメソッドを呼び出すことですが、クラス内の静的メソッドを呼び出したい場合は、スレッド同期メソッドまたは同期ブロックを使用して唯一のロックを取得できます。クラス内でロックする場合、複数のスレッドで同時に同じクラスの静的メソッドを呼び出すことで実現できます。制御されており、コードは次のとおりです: 🎜🎜🎜🎜
rrreee
🎜注意🎜🎜🎜🎜🎜 スレッドの安全性と同期制御を実現するには、実行が非staticの場合、同期メソッドまたは同期ブロックは同じオブジェクトを使用する必要があります。あるスレッドが static 同期メソッドにアクセスする場合、他のスレッドが非静的同期メソッドにアクセスする場合、この 2 つは競合しません。 1 つはクラス ロックで、もう 1 つはオブジェクト ロックであるためです🎜 🎜🎜🎜🎜🎜🎜🎜 スレッド同期ブロックを使用する場合、同期ブロック内のコードはアクセス制御されますが、外部のコードはすべてのスレッドからアクセス可能です🎜🎜🎜🎜🎜🎜🎜🎜同期されたコードブロックが実行されているとき スレッドで例外が発生した場合、jvm は現在のスレッドが占有しているロックを自動的に解放するため、デッドロックは発生しません例外へ🎜🎜🎜🎜🎜参考記事🎜🎜🎜🎜🎜🎜

以上が同期とは何ですか?同期の使い方は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Java での Synchronized の原理と使用シナリオ、および Callable インターフェイスの使用法と差異分析 Java での Synchronized の原理と使用シナリオ、および Callable インターフェイスの使用法と差異分析 Apr 21, 2023 am 08:04 AM

1. 基本機能 1. 楽観的ロックで開始し、ロック競合が多発する場合は悲観的ロックに変換する 2. 軽量なロック実装で開始し、長時間ロックを保持するとロックを解除する3. 軽量ロックを実装するときに最もよく使用されるスピン ロック戦略 4. 不公平なロックである 5. リエントラント ロックである 6. 読み取り/書き込みロックではない 2. JVMロック プロセスを同期します。 ロックは、ロックなし、バイアスされたロック、軽量ロック、および重量ロックの状態に分類されます。状況に応じて順次バージョンアップしていきます。偏ったロックは男主人公を鍵、女主人公をスレとするもので、このスレッドだけがこのロックを使用すれば、たとえ結婚証明書を取得しなくても男主人公と女主人公は永遠に幸せに暮らせる(高額回避) -コストオペレーション)しかし、女性のサポート役が登場します

Javaキーワード同期原理とロック状態の分析例 Javaキーワード同期原理とロック状態の分析例 May 11, 2023 pm 03:25 PM

1. Java におけるロックの概念 Spin ロック: スレッドがロックを取得するとき、そのロックが別のスレッドによって取得されている場合、スレッドはループで待機し、ロックが正常に取得できるかどうかを判断し続けます。ロックが取得されると、ロックはループを終了します。楽観的ロック: 競合がないことを前提として、データを変更する際に以前に取得したデータと不整合が見つかった場合、最新のデータを読み込み、変更を再試行します。悲観的ロック: 同時実行性の競合が発生することを想定し、すべてのデータ関連操作を同期し、データが読み取られた時点からロックを開始します。排他的ロック (書き込み): リソースに書き込みロックを追加します。スレッドはリソースを変更できますが、他のスレッドはリソースを再度ロックすることはできません (単一書き込み)。共有ロック (読み取り): リソースに読み取りロックを追加した後、読み取りのみ可能ですが変更はできません。他のスレッドは読み取りロックのみを追加でき、書き込みロック (複数) を追加できません。 S として参照

synchronized を使用して Java で同期メカニズムを実装するにはどうすればよいですか? synchronized を使用して Java で同期メカニズムを実装するにはどうすればよいですか? Apr 22, 2023 pm 02:46 PM

Java 1 での synchronized の使い方のまとめ。関数修飾子として synchronized を使用した場合のサンプルコードは次のようになります: Publicsynchronizedvoidmethod(){//….} これが同期メソッドですが、このときどのオブジェクトが同期ロックされているのでしょうか?彼がロックするのは、この同期されたメソッド オブジェクトを呼び出すことです。言い換えれば、オブジェクト P1 がこの同期メソッドを異なるスレッドで実行すると、同期効果を達成するために相互排他が形成されます。ただし、このオブジェクトが属するクラスが生成する別のオブジェクトP2は、synchronizedキーワードを付加してこのメ​​ソッドを任意に呼び出すことができる。上記のサンプルコードなど。

Java の 3 つの同期方法とその使用方法は何ですか? Java の 3 つの同期方法とその使用方法は何ですか? Apr 27, 2023 am 09:34 AM

1. 同期は最も一般的に使用される同期方法であり、これには主に 3 つの使用方法があることを説明します。 2. 例//一般的なクラス メソッドの同期 synchronizedpublidvoidinvoke(){}//クラスの静的メソッドの同期 synchronizedpublicstaticvoidinvoke(){}//コード ブロックの同期 synchronized(object){}これら 3 つのメソッドの違いは、同期されるオブジェクトが異なることです。通常のクラスはオブジェクト自体を同期し、静的メソッドはクラス自体を同期し、コード ブロックは括弧内のオブジェクトを同期します。 Javaにはどのようなコレクションがありますか?

Java 同期ロックのアップグレードの原理とプロセスは何ですか? Java 同期ロックのアップグレードの原理とプロセスは何ですか? Apr 19, 2023 pm 10:22 PM

ツールの準備 同期の原理について正式に説明する前に、まずスピン ロックについて話しましょう。スピン ロックは同期の最適化に大きな役割を果たすためです。スピン ロックを理解するには、まずアトミック性とは何かを理解する必要があります。いわゆるアトミック性とは、単に各操作が行われないか完了することを意味します。すべてを行うということは、操作中に中断できないことを意味します。たとえば、変数データに 1 を追加するには、次の 3 つのステップがあります: メモリからレジスタにロードする。データの値に 1 を加算します。結果をメモリに書き込みます。原子性とは、スレッドがインクリメント操作を実行しているときに、他のスレッドによって中断できないことを意味し、このスレッドがこれら 3 つのプロセスを完了した場合にのみ実行されます。

Java では、synchronized キーワードを使用するだけでなく、Lock を提供する必要があるのはなぜですか? Java では、synchronized キーワードを使用するだけでなく、Lock を提供する必要があるのはなぜですか? Apr 20, 2023 pm 05:01 PM

概要: synchronized キーワードは、1 つのスレッドのみが同期されたコード ブロックにアクセスできるようにするために Java で提供されています。 synchronized キーワードが提供されているのに、なぜ Lock インターフェースも Java SDK パッケージで提供されるのですか?これは不必要な車輪の再発明でしょうか?今日はこの問題について一緒に話し合います。 Java では synchronized キーワードが提供され、1 つのスレッドのみが同期されたコード ブロックにアクセスできるようにします。 synchronized キーワードが提供されているのに、なぜ Lock インターフェースも Java SDK パッケージで提供されるのですか?これは不必要な車輪の再発明でしょうか?今日は一緒にそれについて話し合いましょう

Java同期とは Java同期とは May 14, 2023 am 08:28 AM

Synchronized とは何ですか? Java 読者は synchronized キーワードに馴染みがありません。これはさまざまなミドルウェア ソース コードや JDK ソース コードで見ることができます。synchronized に詳しくない読者にとっては、synchronized キーワードは複数の言語で使用する必要があることだけを知っています。 -threading.synchronized によりスレッドの安全性を確保できます。これは、ミューテックス ロック (同時に 1 つのスレッドだけが実行でき、他のスレッドは待機します)、または悲観的ロック (同時に 1 つのスレッドだけが実行でき、他のスレッドは待機します) と呼ばれます。JVM 仮想マシンは、開発者は synchronized キーワードを使用するだけで済みます。使用する場合は、ロックのミューテックスとしてオブジェクトを使用する必要があります

Java にはアクセス以外の修飾子がいくつありますか? Java にはアクセス以外の修飾子がいくつありますか? Aug 30, 2023 pm 06:01 PM

Java には、可視性を超えた機能を提供する他の修飾子がいくつか用意されています。これらの修飾子は非アクセス修飾子と呼ばれ、静的として宣言された静的メンバーはクラスのすべてのインスタンスに共通です。静的メンバーは、クラス メモリに格納されるクラス レベルのメンバーです。 Final この修飾子は、変数、メソッド、またはクラスへのさらなる変更を制限するために使用されます。 Final として宣言された変数の値は、その値を取得した後は変更できません。 Final メソッドをサブクラスでオーバーライドしたり、Final クラスのサブクラスを作成したりすることはできません。 Abstract この修飾子はクラスまたはメソッドで使用できます。この修飾子を変数やコンストラクターに適用することはできません。抽象として宣言されたメソッドはサブクラスで変更する必要があります。抽象宣言されたクラスをインスタンス化することはできません。同期 この修飾子は、複数のスレッドを制御するために使用されます。

See all articles