Vectorスレッドセキュリティ

17529 ワード

vectorはすべての方法が同期されていますが、スレッドは安全です.しかし、これは私たちのプログラミングにも一定のスレッドでは安全ではありません.もちろんこれは条件があります.例えば、Vector vectorOfEnemyTankがあります.変数、この変数はオブジェクト属性レベルです.
スレッドメソッド
public boolean isTouchOtherTanke()
{
.......
EnemyTank ee = getEnemyTankOfCount.get(i);
.........
}

ここでgetEnemyTankOfCount変数はvectorOfEnemyTank変数の参照であり、オブジェクトを作成するたびに同じベクトル空間を指し、このベクトル空間がvectorOfEnemyTankである.
しかし、isTouchOtherTankeメソッドを同時に呼び出すスレッドが10個ある場合、10個のスレッドが同じベクトル空間を同時に操作することに相当し、各スレッドはgetEnemyTankOfCountベクトル参照によって同じベクトル空間を操作する.ここでは,スレッド1がvectorOfEnemyTankのベクトル空間に対して動作するため,スレッド2がこのことを知らないため,Vectorを遍歴する際に配列境界を越えるエラーが発生する可能性がある.まとめ:vectorベクトル要素の操作方法はスレッドが安全であるが、これらの方法を組み合わせると、2つの方法が実行されるギャップで、他のスレッドからオブジェクトロックが得られ、属性の状態が変化する可能性がある.このときスレッドを実行する別の方法でエラーが発生する可能性があります.例えば、上記の例で発生する可能性のあるエラーは、配列境界です.
//ソースは以下の通り
 /**
     * @author pengrong
     * @return
     * @  :                        ;
     * @author pengrong        ,                       。
     *                 Vector vectorOfEnemyTank。        ,     ,            
     *                   ,              ,1、         ,          vector  。
     */
    public synchronized static boolean isTouchOtherTank(EnemyTank et, Vector getEnemyTankOfCount) 
    {
        if (getEnemyTankOfCount ==null) {
            return false;

        }
        boolean isTrue =false;
        int X1,Y1,X2,Y2;
        switch ( et.getDierction() ) 
        {
            //       
            case 0:
                /**
                 *   X1,Y1;               
                 */

                X1 = et.getAxisX() + 33;
                Y1 = et.getAxisY() + 53;
                for (int i = 0; i < getEnemyTankOfCount.size(); i++) 
                {
                    //            
                    EnemyTank ee = getEnemyTankOfCount.get(i);
                    //  ee           
                    if ( (ee.getDierction() ==0) || (ee.getDierction() == 2)) 
                    {
                        X2 =ee.getAxisX() +33;
                        Y2 =ee.getAxisY() +53;
                    }
                    else 
                    {
                        X2 = ee.getAxisX() + 53;
                        Y2 = ee.getAxisY() + 33;
                    }

                    /**
                     *     ee    ,     
                     */
                    if ((ee != et) && (ee.isLive() ==true) ) 
                    {

                        /**
                         *                             ,      
                         */
                            //          /  /  /   
                                    //                
                                    if ( ( et.getAxisX() >= ee.getAxisX() ) && ( et.getAxisX() <= X2 ) &&
                                         ( et.getAxisY() >= ee.getAxisY() ) && ( et.getAxisY() <= Y2 ) ) 
                                    {

                                        isTrue =true;
                                    }
                                    if ( ( X1 >= ee.getAxisX() ) && ( X1 <= X2 ) &&
                                         ( et.getAxisY() >= ee.getAxisY() ) && ( et.getAxisY() <= Y2 ) ) 
                                    {
                                        isTrue =true;
                                    }

                                    //                  
                                    if ( ( et.getAxisY() < ee.getAxisY() ) && ( ee.getAxisY() < Y1 ) ) 
                                    {
                                        isTrue =true;

                                    }
                                    //                。       ;        
                                    if ( isTrue == true ) 
                                    {
                                        //this.setDierction(2);
                                    }

                    }

                }
                break;
                //      
            case 2:

                /**
                 *   X1,Y1;               
                 */

                X1 = et.getAxisX() + 33;
                Y1 = et.getAxisY() + 53;
                for (int i = 0; i < getEnemyTankOfCount.size(); i++) 
                {
                    //            
                    EnemyTank ee = getEnemyTankOfCount.get(i);
                    //  ee           
                    if ( (ee.getDierction() ==0) || (ee.getDierction() == 2)) 
                    {
                        X2 =ee.getAxisX() +33;
                        Y2 =ee.getAxisY() +53;
                    }
                    else 
                    {
                        X2 = ee.getAxisX() + 53;
                        Y2 = ee.getAxisY() + 33;
                    }

                    /**
                     *     ee    ,     
                     */
                    if ((ee != et) && (ee.isLive() ==true) ) 
                    {

                        /**
                         *                             ,      
                         */
                            //          /  /  /   
                                    //         
                                    if ( ( et.getAxisX() >= ee.getAxisX() ) && ( et.getAxisX() <= X2 ) &&
                                         ( Y1 >= ee.getAxisY() ) && ( Y1 <= Y2 ) ) 
                                    {

                                        isTrue =true;
                                    }
                                    if ( ( X1 >= ee.getAxisX() ) && ( X1 <= X2 ) &&
                                         ( Y1 >= ee.getAxisY() ) && ( Y1 <= Y2 ) ) 
                                    {
                                        isTrue =true;
                                    }

                                    //                 
                                    if ( ( et.getAxisY() < Y1 ) && ( Y1 < Y2 ) ) 
                                    {
                                        isTrue =true;
                                    }
                                    //                。       ;        
                                    if ( isTrue == true ) 
                                    {
                                        //this.setDierction(0);
                                    }

                    }

                }
                break;
            //          
            case 1 :
                /**
                 *   X1,Y1;               
                 */

                X1 = et.getAxisX() + 53;
                Y1 = et.getAxisY() + 33;
                for (int i = 0; i < getEnemyTankOfCount.size(); i++) 
                {
                    //            
                    EnemyTank ee = getEnemyTankOfCount.get(i);
                    //  ee           
                    if ( (ee.getDierction() ==0) || (ee.getDierction() == 2)) 
                    {
                        X2 =ee.getAxisX() +33;
                        Y2 =ee.getAxisY() +53;
                    }
                    else 
                    {
                        X2 = ee.getAxisX() + 53;
                        Y2 = ee.getAxisY() + 33;
                    }

                    /**
                     *     ee    ,     
                     */
                    if ((ee != et) && (ee.isLive() ==true) ) 
                    {

                        /**
                         *                             ,      
                         */
                            //          /  /  /   
                                    //             
                                    if ( ( X1 >= ee.getAxisX() ) && ( X1 <= X2 ) &&
                                         ( et.getAxisY() >= ee.getAxisY() ) && ( et.getAxisY() <= Y2 ) ) 
                                    {

                                        isTrue =true;
                                    }
                                    if ( ( X1 >= ee.getAxisX() ) && ( X1 <= X2 ) &&
                                         ( Y1 >= ee.getAxisY() ) && ( Y1 <= Y2 ) ) 
                                    {
                                        isTrue =true;
                                    }
                                    //          
                                    if ( ( et.getAxisX() < X2 ) && ( X2 < X1 ) ) 
                                    {
                                        isTrue =true;
                                    }
                                    //                。       ;        
                                    if ( isTrue == true ) 
                                    {
                                        //this.setDierction(3);
                                    }

                    }

                }
                break;

                //      
            case 3: 
                /**
                 *   X1,Y1;               
                 */

                X1 = et.getAxisX() + 53;
                Y1 = et.getAxisY() + 33;
                for (int i = 0; i < getEnemyTankOfCount.size(); i++) 
                {
                    //            
                    EnemyTank ee = getEnemyTankOfCount.get(i);
                    //  ee           
                    if ( (ee.getDierction() ==0) || (ee.getDierction() == 2)) 
                    {
                        X2 =ee.getAxisX() +33;
                        Y2 =ee.getAxisY() +53;
                    }
                    else 
                    {
                        X2 = ee.getAxisX() + 53;
                        Y2 = ee.getAxisY() + 33;
                    }

                    /**
                     *     ee    ,     
                     */
                    if ((ee != et) && (ee.isLive() ==true) ) 
                    {

                        /**
                         *                             ,      
                         */
                            //          /  /  /   
                                    //            
                                    if ( ( et.getAxisX() >= ee.getAxisX() ) && ( et.getAxisX() <= X2 ) &&
                                         ( et.getAxisY() >= ee.getAxisY() ) && ( et.getAxisY() <= Y2 ) ) 
                                    {

                                        isTrue =true;
                                    }
                                    if ( ( et.getAxisX() >= ee.getAxisX() ) && ( et.getAxisX() <= X2 ) &&
                                         ( Y1 >= ee.getAxisY() ) && ( Y1 <= Y2 ) ) 
                                    {
                                        isTrue =true;
                                    }

                                    //          
                                    if ( ( et.getAxisX() < ee.getAxisX() ) && ( ee.getAxisX() < X1 ) )
                                    {
                                        isTrue =true;
                                    }
                                    //                。       ;        
                                    if ( isTrue == true ) 
                                    {
                                        //this.setDierction(1);
                                    }


                    }

                } 

                break;

            default:
                break;
        }

        return isTrue;

    }