Java多线程编程中线程锁与读写锁的使用示例
程序员文章站
2024-03-09 15:16:05
线程锁lock
lock 相当于 当前对象的 synchronized
import java.util.concurrent.locks.lock...
线程锁lock
lock 相当于 当前对象的 synchronized
import java.util.concurrent.locks.lock; import java.util.concurrent.locks.reentrantlock; /* * lock lock = new reentrantlock(); * lock.lock(); lock.unlock(); * 类似于 synchronized,但不能与synchronized 混用 */ public class locktest { public static void main(string[] args) { final outer outer = 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(); 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
读写锁:允许多条线程同时读;不能读中有写;不能写中有读;不能写中有写
import java.util.hashmap; import java.util.map; import java.util.concurrent.locks.readwritelock; import java.util.concurrent.locks.reentrantreadwritelock; /* * 问题:设计一个 缓存机制 的 伪代码 * 从集合中读取数据,读取不到,就写入,再考虑多线程并发的情况 */ public class readwritelocktest2 { private map<string, object> data = new hashmap<string, object>(); private readwritelock lock = new reentrantreadwritelock(); //读写锁 public object getinstance1(string key, object obj) { lock.readlock().lock(); object value = null; try { value = data.get(key); if (value == null) {//一条线程进入这里, lock.readlock().unlock();//读锁解了,其他线程就可能也到这了 lock.writelock().lock();//只能有一条线程到这,写锁开启,要写入数据了 if (data.get(key) == null) { value = obj; /*先判断数据,如果不存在,才写入,,因为 界时当写锁解除后,其他 线程,再想写入时, 判断到数据存在 ,就跳过了。就不会发生同时写入的情况 */ data.put(key, value); } lock.writelock().unlock();//写完了,解锁 lock.readlock().lock(); } } finally { lock.readlock().unlock(); } return value; }