JavaA2Z

KAB-studio > プログラミング > JavaA2Z > ロックとは

ロック

日本語 鍵、施錠
英語 lock
ふりがな ろっく
フリガナ ロック

解説

ある対象に「鍵」を掛けることで、他が使用できない状態にすること。
複数のスレッドアプリケーションが同時にひとつの処理対象にアクセスする場合、一連の処理が完了するまで、他のスレッドアプリケーションに邪魔されたくない場合にロックを掛ける。
そうすると、他のスレッドアプリケーションはアクセス時に一時停止するかエラーとなるため、先に処理を開始した側が安全に処理を完了させることができる。
 
マルチスレッドにおいては、同時に複数のスレッドがひとつのインスタンスにアクセスする場合に、同期を取るための「手段」として、synchronizedブロックもしくはsynchronizedメソッドを用いてロックを掛ける。
インスタンスにロックを掛けることで、あるスレッドがそのインスタンスへの処理を完了するまでは、他のインスタンスが処理をえないようにする。
 
また、アプリケーション単位でもロックをうことがある。
アプリケーションサーバーのように「複数のアプリケーションが起動されてはいけない」場合、「ロック用のファイル」を用意し、起動時にロックが掛かっているか確認し、掛かっていなければファイルにロックを掛け、掛かっていれば何もせずに終了する。
 
このように、ロックを掛ける対象が、必ずしも「処理の対象」とは限らない点に注意。
そのため、ロックは、同期排他の「手段のひとつ」であり、フラグを使用する場合より強制力があるもの、と考えるのがいいだろう。

参考サイト


(KAB-studioからのおしらせです)

サンプルプログラム(とか)サンプルを別ウィンドウで表示サンプルをクリップボードへコピー(WindowsでIEの場合のみ)

// Sample.java
public class Sample
{
    public static void main( String[] args )
    {
        try
        {
            // データクラス。
            DataClass data = new DataClass();

            // 別スレッドの方を呼び出します。
            OtherThread thread = new OtherThread( data );
            thread.start();

            // 2秒待ちます。OtherThreadの方を先に
            // 実行するためです。
            Thread.sleep( 2 * 1000 );

            // こちらでも。
            System.out.println( "Sample開始" );
            // synchronizedブロックを持つメソッドを呼び出します。
            SynchronizeClass synchronizeClass = new SynchronizeClass();
            synchronizeClass.methodHasSynchronizedBlock( "Sample", data );
            System.out.println( "Sample終了" );
            // OtherThread開始
            // synchronizedブロック開始 from OtherThread
            // Sample開始
            // synchronizedブロック終了 from OtherThread
            // synchronizedブロック開始 from Sample
            // OtherThread終了
            // synchronizedブロック終了 from Sample
            // Sample終了
        }
        catch( InterruptedException e )
        {
            // sleep()メソッドが途中で中断されると
            // InterruptedException例外が投げられます。
            // 滅多にないですが。
            e.printStackTrace();
        }
    }
}

/**
*   別スレッドとして実行するためのクラス。
*/
class OtherThread extends Thread
{
    /** データクラス。 */
    private DataClass data;

    /** コンストラクタ。 */
    public OtherThread( DataClass data )
    {
        this.data = data;
    }
    
    /**
    *   Threadクラスのrun()メソッドを
    *   オーバーライドしたメソッド。このメソッドが
    *   別スレッドとして呼び出されます。
    */
    public void run()
    {
        System.out.println( "OtherThread開始" );
        // synchronizedブロックを持つメソッドを呼び出します。
        SynchronizeClass synchronizeClass = new SynchronizeClass();
        synchronizeClass.methodHasSynchronizedBlock( "OtherThread", data );
        System.out.println( "OtherThread終了" );
    }
}

/**
*   同期処理テスト用クラス。
*/
class SynchronizeClass
{
    /**
    *   synchronizedブロックを持つメソッド
    */
    public void methodHasSynchronizedBlock( String name, DataClass data )
    {
        try
        {
            // 変数dataが参照するインスタンスに対してロックを掛けます。
            // 他のスレッドがロック中にここの処理をしようとした場合、
            // ロックが解除されるまで停止し続けます。
            synchronized( data )
            {
                // 変数dataが参照するインスタンスに対してロックを掛かりました。
                System.out.println( "synchronizedブロック開始 from " + name );
                // 5秒待ちます。
                Thread.sleep( 5 * 1000 );
                System.out.println( "synchronizedブロック終了 from " + name );
            }
            // ロックが解除しました。
            // 解除待ちしていたスレッドは処理が再開されます。
        }
        catch( InterruptedException e )
        {
            // sleep()メソッドが途中で中断されると
            // InterruptedException例外が投げられます。
            // 滅多にないですが。
            e.printStackTrace();
        }
    }
}

/**
*   データクラス。
*/
class DataClass
{
}
// Sample.java
public class Sample
{
    public static void main( String[] args )
    {
        try
        {
            // データクラス。
            DataClass data = new DataClass();

            // 別スレッドの方を呼び出します。
            OtherThread thread = new OtherThread( data );
            thread.start();

            // 2秒待ちます。OtherThreadの方を先に
            // 実行するためです。
            Thread.sleep( 2 * 1000 );

            // こちらでも。
            System.out.println( "Sample開始" );
            // synchronizedブロックを持つメソッドを呼び出します。
            SynchronizeClass synchronizeClass = new SynchronizeClass();
            synchronizeClass.methodHasSynchronizedBlock( "Sample", data );
            System.out.println( "Sample終了" );
            // OtherThread開始
            // synchronizedブロック開始 from OtherThread
            // Sample開始
            // synchronizedブロック終了 from OtherThread
            // synchronizedブロック開始 from Sample
            // OtherThread終了
            // synchronizedブロック終了 from Sample
            // Sample終了
        }
        catch( InterruptedException e )
        {
            // sleep()メソッドが途中で中断されると
            // InterruptedException例外が投げられます。
            // 滅多にないですが。
            e.printStackTrace();
        }
    }
}

/**
*   別スレッドとして実行するためのクラス。
*/
class OtherThread extends Thread
{
    /** データクラス。 */
    private DataClass data;

    /** コンストラクタ。 */
    public OtherThread( DataClass data )
    {
        this.data = data;
    }
    
    /**
    *   Threadクラスのrun()メソッドを
    *   オーバーライドしたメソッド。このメソッドが
    *   別スレッドとして呼び出されます。
    */
    public void run()
    {
        System.out.println( "OtherThread開始" );
        // synchronizedブロックを持つメソッドを呼び出します。
        SynchronizeClass synchronizeClass = new SynchronizeClass();
        synchronizeClass.methodHasSynchronizedBlock( "OtherThread", data );
        System.out.println( "OtherThread終了" );
    }
}

/**
*   同期処理テスト用クラス。
*/
class SynchronizeClass
{
    /**
    *   synchronizedブロックを持つメソッド
    */
    public void methodHasSynchronizedBlock( String name, DataClass data )
    {
        try
        {
            // 変数dataが参照するインスタンスに対してロックを掛けます。
            // 他のスレッドがロック中にここの処理をしようとした場合、
            // ロックが解除されるまで停止し続けます。
            synchronized( data )
            {
                // 変数dataが参照するインスタンスに対してロックを掛かりました。
                System.out.println( "synchronizedブロック開始 from " + name );
                // 5秒待ちます。
                Thread.sleep( 5 * 1000 );
                System.out.println( "synchronizedブロック終了 from " + name );
            }
            // ロックが解除しました。
            // 解除待ちしていたスレッドは処理が再開されます。
        }
        catch( InterruptedException e )
        {
            // sleep()メソッドが途中で中断されると
            // InterruptedException例外が投げられます。
            // 滅多にないですが。
            e.printStackTrace();
        }
    }
}

/**
*   データクラス。
*/
class DataClass
{
}

この単語を含むページ

はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
Yahoo!ブックマーク 詳細を表示 users
del.icio.us 登録する RSSに登録
サンプルを別ウィンドウで表示
サンプルをクリップボードへコピー(WindowsでIEの場合のみ)
update:2005/10/13
このページは、Javaプログラミング言語についての用語を網羅した辞書「JavaA2Z」の一ページです。
詳しくは「JavaA2Z」表紙の説明をご覧ください。