线程锁ロック
ロック相当于当前对象的同期
java.util.concurrent.locks.lockをインポートします。 java.util.concurrent.locks.reentrantlockをインポートします。 / * * lock lock = new ReentrantLock(); * lock.lock(); lock.unlock(); *类似于同期、但不能与同期混用 */ public class locktest {public static void main(string [] args){final outourter = new locktest()。new outer();新しいスレッド(new runnable(){@Override public void run(){// todo auto-enerated methood stub while(true){outer.out1( "zhangxiaoxiao"); outer.out2( "lihuoming");}}}})新しいスレッド(new runnable(){@Override public void run(){// todo auto-enerated methood stub while(true){outer.out1( "zhangxiaoxiao"); outer.out2( "lihuoming");}}}}) } class outer {lock lock = new ReentrantLock(); void out1(string name){lock.lock(); int len = name.length(); for(int i = 0; i <len; i ++){system.out.print(name.charat(i)); } system.out.println(); lock.unlock(); } void out2(string name){lock.lock(); int len = name.length(); for(int i = 0; i <len; i ++){system.out.print(name.charat(i)); } system.out.println(); lock.unlock(); }}}
reentrantreadwritelock
读写锁:允许多条线程同时读;不能读中有写;不能写中有读;不能写中有写
java.util.hashmapをインポートします。 java.util.mapをインポートします。 java.util.concurrent.locks.readwritelockをインポートします。 java.util.concurrent.locks.reentrantreadwritelockをインポートします。 / * *问题:设计一个设计一个设计一个 *从集合中读取数据 *从集合中读取数据、读取不到、就写入、再考虑多线程并发的情况 */ public class readwritelocktest2 {private map <string、object> data = new hashmap <string、object>(); private readwritelock lock = new ReentrantreadWritelock(); // public Public Object getInstance1(string key、object obj){lock.readlock()。lock();オブジェクト値= null; try {value = data.get(key); if(value == null){//一条线程进入这里、lock.readLock()。lock(); //读锁解了、其他线程就可能也到这了lock.writeLock()。lock(); //只能有一条线程到这、写锁开启、、要写入数据了if(data.get(key)== null){value = obj; / *先判断数据、如果不存在、才写入、、因为、因为、其他、再想写入时、再想写入时、判断到数据存在、就跳过了。就不会发生同时写入的情况 */ data.put(key、value); } lock.writeLock()。lock(); //写完了、解锁lock.readLock()。lock(); }}最後に{lock.readLock()。lock(); } return値; }