1、Lock能够完成几乎所有synchronize的功能,并且具有锁投票,定时锁,可中断等候锁,synchronize是java语言层面的,是内置的关键字,Lock是一个包,synchronize使用的时候JVM可以自动释放,但是Lock需要程序员在finally块中手动释放。

synchronize在同步资源上,首先线程A获得了该资源的锁,并开始执行,此时他想要操作此资源的程序就必须等待,如果线程A由于某种原因处理常时间的操作状态,那么其他线程就无法得到处理他么的任务,只能无限的等待。所以Lock机制很好的解决了这个问题。

condition(条件队列或者条件变量) 替代了Object监察方法的使用,condition中的方法如下:

    1. // 造成当前线程在接到信号或被中断之前一直处于等待状态。
    2. void await()
    3. // 造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。
    4. boolean await(long time, TimeUnit unit)
    5. // 造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。
    6. long awaitNanos(long nanosTimeout)
    7. // 造成当前线程在接到信号之前一直处于等待状态。
    8. void awaitUninterruptibly()
    9. // 造成当前线程在接到信号、被中断或到达指定最后期限之前一直处于等待状态。
    10. boolean awaitUntil(Date deadline)
    11. // 唤醒一个等待线程。
    12. void signal()
    13. // 唤醒所有等待线程。
    14. void signalAll()

lock接口的方法:

    1. // 获取锁
    2. void lock()
    3. // 如果当前线程未被中断,则获取锁
    4. void lockInterruptibly()
    5. // 返回绑定到此 Lock 实例的新 Condition 实例
    6. Condition newCondition()
    7. // 仅在调用时锁为空闲状态才获取该锁
    8. boolean tryLock()
    9. // 如果锁在给定的等待时间内空闲,并且当前线程未被中断,则获取锁
    10. boolean tryLock(long time, TimeUnit unit)
    11. // 释放锁
    12. void unlock()

package co.DuXieZhe;

import java.util.concurrent.locks.Condition;  
import java.util.concurrent.locks.Lock;  
import java.util.concurrent.locks.ReentrantLock;  
 
public class BoundedBuffer {  
    final Lock lock = new ReentrantLock();// 锁对象  
    final Condition notFull = lock.newCondition();// 写线程条件  
    final Condition notEmpty = lock.newCondition();// 读线程条件  
 
    final Integer[] items = new Integer[10];// 缓存队列  
    int putptr/* 写索引 */, takeptr/* 读索引 */, count/* 队列中存在的数据个数 */;  
 
    public void put(Integer x) throws InterruptedException {  
        lock.lock();  
        try {  
            while (count == items.length)  
                // 如果队列满了  
                notFull.await();// 阻塞写线程  
            items[putptr] = x;// 赋值  
            System.out.println("写入:" + x);  
            if (++putptr == items.length)  
                putptr = 0;// 如果写索引写到队列的最后一个位置了,那么置为0  
            ++count;// 个数++  
            notEmpty.signal();// 唤醒读线程  
        } finally {  
            lock.unlock();  
        }  
    }  
 
    public Integer take() throws InterruptedException {  
        lock.lock();  
        try {  
            while (count == 0)  
                // 如果队列为空  
                notEmpty.await();// 阻塞读线程  
            Integer x = items[takeptr];// 取值  
            System.out.println("读取:" + x);  
            if (++takeptr == items.length)  
                takeptr = 0;// 如果读索引读到队列的最后一个位置了,那么置为0  
            --count;// 个数--  
            notFull.signal();// 唤醒写线程  
            return x;  
        } finally {  
            lock.unlock();  
        }  
    }  
 
    public static void main(String[] args) {  
        final BoundedBuffer b = new BoundedBuffer();  
 
        new Thread(new Runnable() {  
            public void run() {  
                int i = 0;  
                while (true) {  
                    try {  
                        b.put(i++);  
                    } catch (InterruptedException e) {  
                        e.printStackTrace();  
                    }  
                }  
            }  
        }).start();  
        new Thread(new Runnable() {  
            public void run() {  
                while (true) {  
                    try {  
                        b.take();  
                    } catch (InterruptedException e) {  
                        e.printStackTrace();  
                    }  
                }  
            }  
        }).start();  
    }  
}

Synchronized和java.util.concurrent.locks.Lockde区别联系的更多相关文章

  1. synchronized 和 java.util.concurrent.locks.Lock 的异同 ?

    主要相同点:Lock 能完成 synchronized 所实现的所有功能 主要不同点:Lock 有比synchronized 更精确的线程语义和更好的性能. synchronized 会自动释放锁,而 ...

  2. 简述synchronized和java.util.concurrent.locks.Lock的异同?

    主要相同点:Lock能完成synchronized所实现的所有功能 . 主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.synchronized会自动释放锁,而Lock一 ...

  3. 简述synchronized和java.util.concurrent.locks.Lock异同

    主要相同点:Lock能完成synchronized所实现的所有功能.主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.syncronized会自动释放锁,而Lock一定要程 ...

  4. 对比synchronized与java.util.concurrent.locks.Lock 的异同

    主要区别 1.Lock能完成几乎所有synchronized的功能,并有一些后者不具备的功能,如公平锁.等待可中断.锁绑定多个条件等: 2.synchronized 是Java 语言层面的,是内置的关 ...

  5. 简述synchronized和java.util.concurrent.locks.Lock的异同

    1.synchronized 用在方法和代码块的区别? a. 可以只对需要同步的使用 b.与wait(),notify()和notifyall()方法使用比较方便 2.wait() a.释放持有的对象 ...

  6. 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同?

    Lock 是 Java 5 以后引入的新的 API,和关键字 synchronized 相比主要相同点: Lock 能完成 synchronized 所实现的所有功能:主要不同点:Lock 有比 sy ...

  7. (面试题)synchronized 和 java.util.concurrent.locks.Lock 的异同

    主要相同点: Lock 能完成 synchronized 所实现的所有功能: 主要不同点: Lock 有比 synchronized 更精确的线程语义和更好的性能. synchronized 会自动释 ...

  8. 【Java面试题】28 简述synchronized和java.util.concurrent.locks.Lock的异同 ?

    主要相同点:Lock能完成synchronized所实现的所有功能 主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.synchronized会自动释放锁,而Lock一定要 ...

  9. 简述synchronized和java.util.concurrent.locks.Lock的异同 ?

    主要相同点:Lock能完成synchronized所实现的所有功能 主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.synchronized会自动释放锁,而Lock一定要 ...

随机推荐

  1. springboot-全局异常处理类

    @ControllerAdvice public class GlobalExceptionHandler(){ @ExceptionHandler(value=Exception.class) @R ...

  2. Windows命令查看文件MD5,SHA1,SHA256 文件校验

    certutil -hashfile yourfilename.ext MD5 certutil -hashfile yourfilename.ext SHA1 certutil -hashfile ...

  3. Git坑点——remote: error: GH007: Your push would publish a private email address.

    使用命令:git push -u origin master   ,把本地库的内容推送到远程库的过程中,出现了问题 ——remote: error: GH007: Your push would pu ...

  4. cxf动态调用外部web service 报告异常java.lang.NoSuchFieldError: QUALIFIED

    原因:cxf 依赖的xmlschema-core 与xfire-all依赖的xmlschema冲突.(百度搜索亦得知:cxf 依赖的xmlschema-core 与axis2-kernel依赖的xml ...

  5. 调试 - Visual Studio调试

    Visual Studio - 调试 异常处理机制 windows预定义了一系列的异常错误码,每种程序异常都有一个对应的错误码,windows系统将这些类似键值对关系的数据存储在异常处理表中(称为SE ...

  6. Oracle根据【日期】组,其他条件根据PIVOT行转列。使每个日期条件关联的其他数据只有一行。

    select OPER_TIME, MICROPAY, REFUND from ( select trunc(oper_time) oper_time, class_name, sum(total_f ...

  7. Linux 查看系统硬件信息[转]

    原文:http://www.cnblogs.com/ggjucheng/archive/2013/01/14/2859613.html linux查看系统的硬件信息,并不像windows那么直观,这里 ...

  8. linux 服务器下的基本操作

    1.SSH 上传: scp /path/file(这部分为本地的路径) user(远端目标用户名)@host(远端目标IP):/pathorfile(文件存储路径) 下载: scp user(远端用户 ...

  9. 在VS解决方案资源管理器中自动定位当前编辑中的文件

    依次点击 [工具]- [选项] - [项目和解决方案]-[常规]- 勾选[在解决方案资源管理器中跟踪活动项]

  10. copy之深浅拷贝

    深浅拷贝深拷贝 全部复制浅拷贝 只复制第一层 __author__ = 'Perfect' # -*- coding: utf-8 -*- import copy # copy.copy() #浅拷贝 ...