- 浏览: 58611 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
1:lock和synchronized对比
[java]
view plain
copy
- import java.util.concurrent.locks.Lock;
- import java.util.concurrent.locks.ReentrantLock;
- public class LockTest {
- /**
- * @param args
- */
- public static void main(String[] args) {
- new LockTest().init();
- }
- private void init(){
- final Outputer outputer = new Outputer();
- new Thread( new Runnable(){
- @Override
- public void run() {
- while ( true ){
- try {
- Thread.sleep(10 );
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- outputer.output("zhangxiaoxiang" );
- }
- }
- }).start();
- new Thread( new Runnable(){
- @Override
- public void run() {
- while ( true ){
- try {
- Thread.sleep(10 );
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- outputer.output("lihuoming" );
- }
- }
- }).start();
- }
- static class Outputer{
- Lock lock = new ReentrantLock();
- public void output(String name){
- int len = name.length();
- lock.lock();
- try {
- for ( int i= 0 ;i<len;i++){
- System.out.print(name.charAt(i));
- }
- System.out.println();
- }finally {
- lock.unlock();
- }
- }
- public synchronized void output2(String name){
- int len = name.length();
- for ( int i= 0 ;i<len;i++){
- System.out.print(name.charAt(i));
- }
- System.out.println();
- }
- public static synchronized void output3(String name){
- int len = name.length();
- for ( int i= 0 ;i<len;i++){
- System.out.print(name.charAt(i));
- }
- System.out.println();
- }
- }
- }
2.读写锁:ReadWriteLock
[java]
view plain
copy
- import java.util.Random;
- import java.util.concurrent.locks.ReadWriteLock;
- import java.util.concurrent.locks.ReentrantReadWriteLock;
- public class ReadWriteLockTest {
- public static void main(String[] args) {
- final Queue3 q3 = new Queue3();
- for ( int i= 0 ;i< 3 ;i++)
- {
- new Thread(){
- public void run(){
- while ( true ){
- q3.get();
- }
- }
- }.start();
- new Thread(){
- public void run(){
- while ( true ){
- q3.put(new Random().nextInt( 10000 ));
- }
- }
- }.start();
- }
- }
- }
- class Queue3{
- private Object data = null ; //共享数据,只能有一个线程能写该数据,但可以有多个线程同时读该数据。
- ReadWriteLock rwl = new ReentrantReadWriteLock();
- public void get(){
- rwl.readLock().lock();
- try {
- System.out.println(Thread.currentThread().getName() + " be ready to read data!" );
- Thread.sleep((long )(Math.random()* 1000 ));
- System.out.println(Thread.currentThread().getName() + "have read data :" + data);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }finally {
- rwl.readLock().unlock();
- }
- }
- public void put(Object data){
- rwl.writeLock().lock();
- try {
- System.out.println(Thread.currentThread().getName() + " be ready to write data!" );
- Thread.sleep((long )(Math.random()* 1000 ));
- this .data = data;
- System.out.println(Thread.currentThread().getName() + " have write data: " + data);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }finally {
- rwl.writeLock().unlock();
- }
- }
- }
3.用读写锁实现一个简单缓存机制
[java]
view plain
copy
- import java.util.HashMap;
- import java.util.Map;
- import java.util.concurrent.locks.ReadWriteLock;
- import java.util.concurrent.locks.ReentrantReadWriteLock;
- public class CacheDemo {
- private Map<String, Object> cache = new HashMap<String, Object>();
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- }
- private ReadWriteLock rwl = new ReentrantReadWriteLock();
- public Object getData(String key){
- rwl.readLock().lock();
- Object value = null ;
- try {
- value = cache.get(key);
- if (value == null ){
- rwl.readLock().unlock();
- rwl.writeLock().lock();
- try {
- if (value== null ){
- value = "aaaa" ; //实际失去queryDB();
- }
- }finally {
- rwl.writeLock().unlock();
- }
- rwl.readLock().lock();
- }
- }finally {
- rwl.readLock().unlock();
- }
- return value;
- }
-
}
发表评论
-
ReentrantLock与synchronized的区别
2012-10-22 13:33 532ReentrantLock 的lock机制有2种,忽略中断 ... -
java的concurrent/java.util.concurrent.locks用法详解
2012-10-19 15:49 740java.util.concurrent.locks - ... -
java.util.concurrent详解(四) BlockingQueue
2012-10-19 10:00 7997.BlockingQueue “支持两个附加操作 ... -
java.util.concurrent详解(三)ScheduledThreadPoolExecutor
2012-10-18 14:32 8646. ScheduledThreadPoolExecutor ... -
java.util.concurrent详解(二)Semaphore/FutureTask/Exchanger
2012-10-18 14:31 985------------------------------- ... -
java.util.concurrent详解(一) Latch/Barrier
2012-10-18 14:30 1036Java1.5提供了一个非常高效实用的多线程包:java.ut ... -
浅析Java中CountDownLatch用法
2012-10-16 18:09 8CountDownLatch如其所写,是一个倒计数的锁存器,当 ... -
Java轻量级锁原理详解(Lightweight Locking)
2012-10-11 18:06 813大家知道,Java的多线程 ... -
深入理解DCL(双检锁)的安全性
2012-10-11 18:07 968对于双检锁,其实有多种不同的用法,有很多种用法是无论如何不会出 ... -
Java偏向锁实现原理(Biased Locking)
2012-10-11 18:08 759阅读本文的读者,需要对Java轻量级锁有一定的了解,知道loc ... -
多线程下race condition问题
2012-10-11 18:07 1427这个问题的讨论来自内部的一个关于“多线程环境下使用Hashma ...
相关推荐
- `ReadWriteLock`接口:这是读写锁的接口,扩展了基础锁的概念,提供了创建读锁和写锁的方法,以及获取当前读写状态的统计信息。它还包含两个工厂方法,用于创建读写锁实例,可以指定是否优先满足写入需求。 2. *...
具体实现时,可以创建一个`ReadWriteLock`实例,读操作使用`readLock()`,写操作使用`writeLock()`。这样,多个读操作可以并发进行,而写操作会阻塞所有其他读写操作,直到写操作完成。 2. **Lock接口的优势** ...
Java的锁机制包括内置锁(synchronized)、显式锁(Lock接口)、读写锁(ReadWriteLock)等,适用于不同的同步需求。同步处理线程间的共享数据,而异步则让任务并发执行,等待结果。 AOP(面向切面编程)用于分离...
使用`Thread.join()`方法可以轻松地实现线程间的顺序执行,而`Lock`接口则提供了更高级别的锁控制机制,尤其是对于需要更复杂锁定逻辑的应用场景,如实现高效缓存时,`ReadWriteLock`提供了很好的解决方案。...
- **ReadWriteLock** 提供读写锁,支持多个读线程并行,写线程独占。 - **StampedLock** 提供乐观读和悲观写的能力,适用于读多写少的情况,进一步优化性能。 了解这些核心概念和技术,开发者能够编写出高效、安全...
- **Lock接口**:提供比synchronized更细粒度的锁控制,如ReentrantLock,支持公平锁和非公平锁。 - **volatile**:保证共享变量的可见性,防止数据不一致。 - **原子操作**:Atomic类提供原子操作,如...
- Lock接口及其实现:ReentrantLock、ReadWriteLock等提供更细粒度的锁控制。 5. **Spring MVC工作流程**: - 用户请求到达前端控制器DispatcherServlet。 - DispatcherServlet根据请求映射找到对应的...
25 3:ServicorTo 和 ServicorFrom 互换................................................................................................................25 2.3.3.1. 2.4.1. 如何确定垃圾 ......................