JDKロックの件
2860 ワード
なぜロックが必要ですか?(1)マルチタスク環境でのみ必要である;(2)タスクは同じ共有リソースに対して書き込み操作を行う必要がある;(3)リソースへのアクセスは反発する;
ロックにはどのようなライフサイクルがありますか?(1)競合によってロックを取得してこそ、そのリソースを操作することができる(競合ロック);(2)あるタスクがリソースを更新している場合(ロックがかかっている);(3)他のタスクは、そのリソースを操作できない(タスクブロック);(4)タスクが更新を完了するまで(ロックが解除される);
シミュレーションシーン(列車の切符100枚販売)
ロックにはどのようなライフサイクルがありますか?(1)競合によってロックを取得してこそ、そのリソースを操作することができる(競合ロック);(2)あるタスクがリソースを更新している場合(ロックがかかっている);(3)他のタスクは、そのリソースを操作できない(タスクブロック);(4)タスクが更新を完了するまで(ロックが解除される);
シミュレーションシーン(列車の切符100枚販売)
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
// 100 ,
// java Runnable
public class TicketTest implements Runnable{
private int count = 100;
// jvm , ,
// , , jvm
// , ,
//private static int count = 100;//
private Lock lock = new ReentrantLock();
//java juc
public static void main(String[] args) {
TicketTest t = new TicketTest();
//
Thread t1 = new Thread(t," A");
Thread t2 = new Thread(t," B");
Thread t3 = new Thread(t," C");
Thread t4 = new Thread(t," D");
t1.start();
t2.start();
t3.start();
t4.start();
}
public void run() {
while(count > 0) {
// // , , ,
// if(count > 0) {//
// System.out.println(Thread.currentThread().getName()+
// " "+
// count+
// " ");
// count--;
// }
// try {
// Thread.sleep(50);// 50
// } catch (Exception e) {
// // TODO: handle exception
// }
// // , , “ “ ,
// synchronized(this){
// if(count > 0) {//
// System.out.println(Thread.currentThread().getName()+
// " "+
// count+
// " ");
// count--;
// }
// }
// try {
// Thread.sleep(50);// 50
// } catch (Exception e) {
// // TODO: handle exception
// }
// // , synchronized
// sale();
// try {
// Thread.sleep(50);// 50
// } catch (Exception e) {
// // TODO: handle exception
// }
// , juc lock
//lock synchronized , jdk ,lock
lock.lock();// , , 4
try {
if(count > 0) {//
System.out.println(Thread.currentThread().getName()+
" "+
count+
" ");
count--;
}
} catch (Exception e) {
// TODO: handle exception
} finally {
lock.unlock();// , , 、 ,
}
try {
Thread.sleep(50);// 50
} catch (Exception e) {
// TODO: handle exception
}
}
}
// // , synchronized
// public synchronized void sale(){ //
// if(count > 0) {//
// System.out.println(Thread.currentThread().getName()+
// " "+
// count+
// " ");
// count--;
// }
// }
/**** , :jvm ****/
}