Javaでのスレッド同期

3519 ワード

JAvaでは、複数のスレッドが共有可能なリソース変数を同時に操作すると(データの削除変更など)、データが不正確になり、互いに衝突する可能性があるため、スレッドが操作を完了する前に他のスレッドに呼び出されないように同期ロックを追加し、変数の一意性と正確性を保証します.
PS:sleep()は同期ロックを解放せず、wait()は同期ロックを解放します.sleep()はThreadの静的方法であり,wait()はObjectの方法である.また、sleep(milliseconds)は時間指定で自動的に目を覚ますことができ、時間がない場合はinterreput()を呼び出して強制的に中断するしかありません.wait()はnotify()で直接喚起することができる.
同期メソッド
1、synchronizedキーワード修飾の方法:public synchronized void save(){}
2、synchronizedキーワード修飾文ブロック:synchronized(object){}
package com.xhj.thread;
 
    /**
     *        
     * 
     * @author XIEHEJUN
     * 
     */
    public class SynchronizedThread {
 
        class Bank {
 
            private int account = 100;
 
            public int getAccount() {
                return account;
            }
 
            /**
             *        
             * @param money
             */
            public synchronized void save(int money) {
                account += money;
            }
 
            /**
             *         
             * @param money
             */
            public void save1(int money) {
                synchronized (this) {
                    account += money;
                }
            }
        }
 
        class NewThread implements Runnable {
            private Bank bank;
 
            public NewThread(Bank bank) {
                this.bank = bank;
            }
 
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    // bank.save1(10);
                    bank.save(10);
                    System.out.println(i + "     :" + bank.getAccount());
                }
            }
 
        }
 
        /**
         *     ,     
         */
        public void useThread() {
            Bank bank = new Bank();
            NewThread new_thread = new NewThread(bank);
            System.out.println("  1");
            Thread thread1 = new Thread(new_thread);
            thread1.start();
            System.out.println("  2");
            Thread thread2 = new Thread(new_thread);
            thread2.start();
        }
 
        public static void main(String[] args) {
            SynchronizedThread st = new SynchronizedThread();
            st.useThread();
        }
    }

3、特殊ドメイン変数(volatile)を使用してスレッド同期を実現する
 //         ,       
        class Bank {
            //         volatile
            private volatile int account = 100;
 
            public int getAccount() {
                return account;
            }
            //      synchronized 
            public void save(int money) {
                account += money;
            }
        }

4、再入錠を使用してスレッド同期をJavaSE 5で実現する.0にjavaが追加されました.util.concurrentパッケージは、同期をサポートします.ReentrantLockクラスは、synchronizedメソッドと高速を使用するのと同じ基本的な動作と意味を持つロックであり、その能力を拡張したReenreantLockクラスの一般的な方法は、ReentrantLock()です.ReentrantLockインスタンスlock()を作成します.ロックunlock()を取得します.ロックを解除します.
        class Bank {
            private int account = 100;
            //       
            private Lock lock = new ReentrantLock();
            public int getAccount() {
                return account;
            }
            //      synchronized 
            public void save(int money) {
                lock.lock();
                try{
                    account += money;
                }finally{
                    lock.unlock();
                }
            }
        }

参考原文:http://www.2cto.com/kf/201408/324061.html