Vectorスレッドセキュリティ
17529 ワード
vectorはすべての方法が同期されていますが、スレッドは安全です.しかし、これは私たちのプログラミングにも一定のスレッドでは安全ではありません.もちろんこれは条件があります.例えば、Vector vectorOfEnemyTankがあります.変数、この変数はオブジェクト属性レベルです.
スレッドメソッド
ここでgetEnemyTankOfCount変数はvectorOfEnemyTank変数の参照であり、オブジェクトを作成するたびに同じベクトル空間を指し、このベクトル空間がvectorOfEnemyTankである.
しかし、isTouchOtherTankeメソッドを同時に呼び出すスレッドが10個ある場合、10個のスレッドが同じベクトル空間を同時に操作することに相当し、各スレッドはgetEnemyTankOfCountベクトル参照によって同じベクトル空間を操作する.ここでは,スレッド1がvectorOfEnemyTankのベクトル空間に対して動作するため,スレッド2がこのことを知らないため,Vectorを遍歴する際に配列境界を越えるエラーが発生する可能性がある.まとめ:vectorベクトル要素の操作方法はスレッドが安全であるが、これらの方法を組み合わせると、2つの方法が実行されるギャップで、他のスレッドからオブジェクトロックが得られ、属性の状態が変化する可能性がある.このときスレッドを実行する別の方法でエラーが発生する可能性があります.例えば、上記の例で発生する可能性のあるエラーは、配列境界です.
//ソースは以下の通り
スレッドメソッド
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;
}