Synchronized和java.util.concurrent.locks.Lockde区别联系
1、Lock能够完成几乎所有synchronize的功能,并且具有锁投票,定时锁,可中断等候锁,synchronize是java语言层面的,是内置的关键字,Lock是一个包,synchronize使用的时候JVM可以自动释放,但是Lock需要程序员在finally块中手动释放。
synchronize在同步资源上,首先线程A获得了该资源的锁,并开始执行,此时他想要操作此资源的程序就必须等待,如果线程A由于某种原因处理常时间的操作状态,那么其他线程就无法得到处理他么的任务,只能无限的等待。所以Lock机制很好的解决了这个问题。
condition(条件队列或者条件变量) 替代了Object监察方法的使用,condition中的方法如下:
- // 造成当前线程在接到信号或被中断之前一直处于等待状态。
- void await()
- // 造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。
- boolean await(long time, TimeUnit unit)
- // 造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。
- long awaitNanos(long nanosTimeout)
- // 造成当前线程在接到信号之前一直处于等待状态。
- void awaitUninterruptibly()
- // 造成当前线程在接到信号、被中断或到达指定最后期限之前一直处于等待状态。
- boolean awaitUntil(Date deadline)
- // 唤醒一个等待线程。
- void signal()
- // 唤醒所有等待线程。
- void signalAll()
lock接口的方法:
- // 获取锁
- void lock()
- // 如果当前线程未被中断,则获取锁
- void lockInterruptibly()
- // 返回绑定到此 Lock 实例的新 Condition 实例
- Condition newCondition()
- // 仅在调用时锁为空闲状态才获取该锁
- boolean tryLock()
- // 如果锁在给定的等待时间内空闲,并且当前线程未被中断,则获取锁
- boolean tryLock(long time, TimeUnit unit)
- // 释放锁
- 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区别联系的更多相关文章
- synchronized 和 java.util.concurrent.locks.Lock 的异同 ?
		主要相同点:Lock 能完成 synchronized 所实现的所有功能 主要不同点:Lock 有比synchronized 更精确的线程语义和更好的性能. synchronized 会自动释放锁,而 ... 
- 简述synchronized和java.util.concurrent.locks.Lock的异同?
		主要相同点:Lock能完成synchronized所实现的所有功能 . 主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.synchronized会自动释放锁,而Lock一 ... 
- 简述synchronized和java.util.concurrent.locks.Lock异同
		主要相同点:Lock能完成synchronized所实现的所有功能.主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.syncronized会自动释放锁,而Lock一定要程 ... 
- 对比synchronized与java.util.concurrent.locks.Lock 的异同
		主要区别 1.Lock能完成几乎所有synchronized的功能,并有一些后者不具备的功能,如公平锁.等待可中断.锁绑定多个条件等: 2.synchronized 是Java 语言层面的,是内置的关 ... 
- 简述synchronized和java.util.concurrent.locks.Lock的异同
		1.synchronized 用在方法和代码块的区别? a. 可以只对需要同步的使用 b.与wait(),notify()和notifyall()方法使用比较方便 2.wait() a.释放持有的对象 ... 
- 简述 synchronized 和 java.util.concurrent.locks.Lock  的异同?
		Lock 是 Java 5 以后引入的新的 API,和关键字 synchronized 相比主要相同点: Lock 能完成 synchronized 所实现的所有功能:主要不同点:Lock 有比 sy ... 
- (面试题)synchronized 和 java.util.concurrent.locks.Lock 的异同
		主要相同点: Lock 能完成 synchronized 所实现的所有功能: 主要不同点: Lock 有比 synchronized 更精确的线程语义和更好的性能. synchronized 会自动释 ... 
- 【Java面试题】28 简述synchronized和java.util.concurrent.locks.Lock的异同 ?
		主要相同点:Lock能完成synchronized所实现的所有功能 主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.synchronized会自动释放锁,而Lock一定要 ... 
- 简述synchronized和java.util.concurrent.locks.Lock的异同 ?
		主要相同点:Lock能完成synchronized所实现的所有功能 主要不同点:Lock有比synchronized更精确的线程语义和更好的性能.synchronized会自动释放锁,而Lock一定要 ... 
随机推荐
- Liunx/RHEL6.5 Oracle11 安装记录[缺少依赖包的解决方案]
			1.将镜像文件挂,如/mnt # mount -o loop rhel-server-6.1-x86_64-dvd.iso /mnt#这一步其实有很多实现方法,如可以将镜像文件中的Packages文件 ... 
- JSP表达式语音EF--2
			JSP 表达式语言 | 菜鸟教程 http://www.runoob.com/jsp/jsp-expression-language.html 
- flask基本介绍及虚拟环境
			Flask Flask诞生于2010年,是Armin ronacher(人名)用 Python 语言基于 Werkzeug 工具箱编写的轻量级Web开发框架. Flask 本身相当于一个内核,其他几乎 ... 
- ActiveMQ 动态网络链接
			ActiveMQ的broker-broker方式有两种,一种 静态连接一种是动态连接,一般使用静态连接,动态连接了解就好,没有过多的去测试. 1. 多播协议multicast ActiveMQ使用Mu ... 
- CLR via C# 中关于装箱拆箱的摘录
			装箱: 为了将一个值类型转换成一个引用类型,要使用一个名为装箱(boxing)的机制.下面总结了对值类型的一个实例进行装箱操作时在内部发生的事情. 1.在托管堆中分配好内存.分配的内存量是值类型的各 ... 
- 题解-BOI 2004 Sequence
			Problem bzoj & Luogu 题目大意: 给定序列\(\{a_i\}\),求一个严格递增序列\(\{b_i\}\),使得\(\sum \bigl |a_i-b_i\bigr|\)最 ... 
- 【转】ArrayList与LinkedList的区别和适用场景
			ArrayList 优点:ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的). 缺点:因为地址连续,当要插入和删除时,Arra ... 
- sqlserver 2012 分页
			--2012的OFFSET分页方式 select number from spt_values where type='p' order by number offset 10 rows fetch ... 
- 毫秒倒计时小Demo
			Demo截图: Demo:Demo 上代码: <!DOCTYPE html> <html lang="en"> <head> <meta ... 
- 【原创】大数据基础之Hive(3)最简绿色部署
			hadoop部署参考:https://www.cnblogs.com/barneywill/p/10428098.html 1 拷贝到所有服务器上并解压 # ansible all-servers - ... 
