线程锁 Lock
Bloqueio 相当于 当前对象的 sincronizado
importar java.util.concurrent.locks.lock; importar java.util.concurrent.locks.reentrantlock; / * * Lock Lock = new ReentrantLock (); * Lock.lock (); Lock.Unlock (); * 类似于 Sincronizado , 但不能与 Sincronizado 混用 */ public class Locktest {public static void main (string [] args) {final externo final = new LockTest (). New Outer (); novo thread (new runnable () {@Override public void run () {// ToDO Method Auto-Gerated Method Stub while (true) {Outer.out1 ("zhangxiaoxiao"); outer.out2 ("lihuoming");}}}). start (); novo thread (new runnable () {@Override public void run () {// ToDO Method Auto-Gerated Method Stub while (true) {Outer.out1 ("zhangxiaoxiao"); outer.out2 ("lihuoming");}}}). start (); } classe externo {bloqueio bloqueado = new reentrantlock (); void out1 (nome da string) {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 (nome da string) {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
读写锁: 允许多条线程同时读;不能读中有写;不能写中有读;不能写中有写
importar java.util.hashmap; importar java.util.map; importar java.util.concurrent.locks.readwritelock; importar java.util.concurrent.locks.reentrantreadwritelock; / * * 问题 : 设计一个 缓存机制 的 伪代码 * 从集合中读取数据 , 读取不到 , 就写入 , 再考虑多线程并发的情况 */ classe pública readWritelockTest2 {mapa privado <string, objeto> data = new hashmap <string, object> (); Private ReadWritelock Lock = new ReentrantreadWritelock (); // 读写锁 Public Object getInstance1 (tecla String, objeto obj) {Lock.readlock (). Lock (); Valor do objeto = nulo; tente {value = data.get (key); if (value == null) {// 一条线程进入这里 , Lock.readlock (). Unlock (); // 读锁解了 , 其他线程就可能也到这了 Lock.Writelock (). Lock (); // 只能有一条线程到这 , 写锁开启 , 要写入数据了 if (data.get (chave) == null) {value = obj; / *先判断数据 , 如果不存在 , 才写入 , 因为 界时当写锁解除后 , 其他 线程 , 再想写入时 , 判断到数据存在 , 就跳过了。就不会发生同时写入的情况 */ data.put (chave, valor); } lock.WriteLock (). desbloqueio (); // 写完了 , 解锁 Lock.readlock (). Lock (); }} finalmente {Lock.readlock (). Unlock (); } retornar valor; }