线程锁 Kunci
Kunci 相当于 当前对象的 disinkronkan
impor java.util.concurrent.locks.lock; impor java.util.concurrent.locks.reentrantlock; / * * Lock lock = baru reentrantlock (); * lock.lock (); lock.unlock (); * 类似于 disinkronkan , 但不能与 disinkronkan 混用 */ kelas publik locktest {public static void main (string [] args) {final Outer Outer = new LockTest (). New Outer (); utas baru (runnable baru () {@Override public void run () {// todo Metode yang dihasilkan otomatis Stub while (true) {OUTER.OUT1 ("Zhangxiaoxiao"); outer.out2 ("Lihuoming");}}}). Mulai (); utas baru (runnable baru () {@Override public void run () {// todo Metode yang dihasilkan otomatis Stub while (true) {OUTER.OUT1 ("Zhangxiaoxiao"); outer.out2 ("Lihuoming");}}}). Mulai (); } kelas luar {lock lock = baru reentrantlock (); void out1 (nama string) {lock.lock (); int len = name.length (); untuk (int i = 0; i <len; i ++) {System.out.print (name.charat (i)); } System.out.println (); lock.unlock (); } void out2 (nama string) {lock.lock (); int len = name.length (); untuk (int i = 0; i <len; i ++) {System.out.print (name.charat (i)); } System.out.println (); lock.unlock (); }}}
读写锁 ReentrantReadWritelock
读写锁 : 允许多条线程同时读;不能读中有写;不能写中有读;不能写中有写
impor java.util.hashmap; impor java.util.map; impor java.util.concurrent.locks.readwritelock; impor java.util.concurrent.locks.reentrantreadwritelock; / * * 问题 : 设计一个 缓存机制 的 伪代码 * 从集合中读取数据 , 读取不到 , 就写入 , 再考虑多线程并发的情况 */ kelas publik ReadWritelockTest2 {private Map <String, Object> Data = HashMap baru <String, Object> (); private readwritelock lock = baru reentrantreadwritelock (); // 读写锁 objek publik getInstance1 (tombol string, objek obj) {lock.readlock (). Lock (); Nilai objek = null; coba {value = data.get (key); if (value == null) {// 一条线程进入这里 , lock.readlock (). buka kunci (); // 读锁解了 , 其他线程就可能也到这了 lock.writelock (). lock (); // 只能有一条线程到这 , , , , 要写入数据了 if (data.get (kunci) == null) {value = obj; / *先判断数据 , 如果不存在 , 才写入 , , 因为 界时当写锁解除后 , 其他 线程 , 再想写入时 , 判断到数据存在 , 就跳过了。就不会发生同时写入的情况 */ data.put (tombol, nilai); } lock.writelock (). buka kunci (); // 写完了 , 解锁 lock.readlock (). lock (); }} akhirnya {lock.readlock (). buka kunci (); } nilai pengembalian; }