线程锁 Bloqueo
Bloqueo 相当于 当前对象的 Sincronizado
import java.util.concurrent.locks.lock; import java.util.concurrent.locks.reentrantlock; / * * Bloqueo de bloqueo = nuevo reentrantlock (); * Lock.lock (); Lock.unlock (); * 类似于 Sincronizado 但不能与 但不能与 Sincronizado 混用 */ public class Locktest {public static void main (string [] args) {final externo externo = new Locktest (). New Outer (); new Thread (new Runnable () {@Override public void run () {// tODO Auto Generated Method stub while (true) {outer.out1 ("zhangxiaoxiao"); outer.out2 ("lihuoming");}}}). start (); new Thread (new Runnable () {@Override public void run () {// tODO Auto Generated Method stub while (true) {outer.out1 ("zhangxiaoxiao"); outer.out2 ("lihuoming");}}}). start (); } class Outer {Lock Lock = New ReentrantLock (); vacío1 (nombre de cadena) {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 (nombre de cadena) {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
读写锁 : 允许多条线程同时读;不能读中有写;不能写中有读;不能写中有写
import java.util.hashmap; import java.util.map; import java.util.concurrent.locks.readwriteLock; import java.util.concurrent.locks.reentrantreadwriteLock; / * * 问题 : 设计一个 缓存机制 的 伪代码 * 从集合中读取数据 , 读取不到 , 就写入 , , 再考虑多线程并发的情况 */ public class ReadWriteReLockTest2 {private map <string, object> data = new Hashmap <String, Object> (); LOCK de ReadWriteLock privado = new ReentRantReadWriteLock (); // 读写锁 Objeto público getInStance1 (tecla de cadena, objeto obj) {Lock.ReadLock (). Lock (); Valor de objeto = nulo; intente {value = data.get (key); if (value == null) {//一条线程进入这里, lock.readLock().unlock();//读锁解了,其他线程就可能也到这了 lock.writeLock().lock();//只能有一条线程到这,写锁开启,要写入数据了 if (data.get(key) == null) { value = obj; / *先判断数据 , 如果不存在 , 才写入 , 因为 因为 , 其他 线程 , 再想写入时 , 判断到数据存在 , 就跳过了。就不会发生同时写入的情况 */ data.put (clave, valor); } Lock.WriteLock (). desbloqueo (); // 写完了 , 解锁 Lock.ReadLock (). Lock (); }} Finalmente {Lock.ReadLock (). desbloqueo (); } valor de retorno; }