一、synchronized
         这货可以锁对象,锁变量,锁方法,锁代码,好像什么都能锁,缺点就是如果一个锁堵了,其他的只能等待忙并不能把当前的锁给释放。
二、 ReentrantLock
ReentrantLock 类实现了Lock ,它拥有与synchronized 相同的并发性和内存语义,但是添加了类似锁投票定时锁等候可中断锁等候的一些特性。此外,它还提供了在激烈争用情况下更佳的性能
  • class Outputter1 {
  • private Lock lock = new ReentrantLock();// 锁对象
  • public void output(String name) {
  • lock.lock();      // 得到锁
  • try {
  • for(int i = 0; i < name.length(); i++) {
  • System.out.print(name.charAt(i));
  • }
  • } finally {
  • lock.unlock();// 释放锁
  • }
  • }
  • }

三、ReadWriteLock

读写分离,读的有多个,写的只有一个,看代码
    
  • class Data {
  • private int data;// 共享数据
  • private ReadWriteLock rwl = new ReentrantReadWriteLock();
  • public void set(int data) {
  • rwl.writeLock().lock();// 取到写锁
  • try {
  • System.out.println(Thread.currentThread().getName() + "准备写入数据");
  • try {
  • Thread.sleep(20);
  • } catch (InterruptedException e) {
  • e.printStackTrace();
  • }
  • this.data = data;
  • System.out.println(Thread.currentThread().getName() + "写入" + this.data);
  • } finally {
  • rwl.writeLock().unlock();// 释放写锁
  • }
  • }
  • public void get() {
  • rwl.readLock().lock();// 取到读锁
  • try {
  • System.out.println(Thread.currentThread().getName() + "准备读取数据");
  • try {
  • Thread.sleep(20);
  • } catch (InterruptedException e) {
  • e.printStackTrace();
  • }
  • System.out.println(Thread.currentThread().getName() + "读取" + this.data);
  • } finally {
  • rwl.readLock().unlock();// 释放读锁
  • }
  • }
  • }

与互斥锁定相比,读-写锁定允许对共享数据进行更高级别的并发访问。虽然一次只有一个线程(writer 线程)可以修改共享数据,但在许多情况下,任何数量的线程可以同时读取共享数据(reader 线程)

从理论上讲,与互斥锁定相比,使用读-写锁定所允许的并发性增强将带来更大的性能提高。

在实践中,只有在多处理器上并且只在访问模式适用于共享数据时,才能完全实现并发性增强。——例如,某个最初用数据填充并且之后不经常对其进行修改的 collection,因为经常对其进行搜索(比如搜索某种目录),所以这样的 collection 是使用读-写锁定的理想候选者。  

java线程锁的更多相关文章

  1. JAVA线程锁-读写锁

    JAVA线程锁,除Lock的传统锁,又有两种特殊锁,叫读写锁ReadWriteLock 其中多个读锁不互斥,读锁和写锁互斥,写锁和写锁互斥 例子: /** * java线程锁分为读写锁 ReadWri ...

  2. Java线程锁一个简单Lock

    /** * @author * * Lock 是java.util.concurrent.locks下提供的java线程锁,作用跟synchronized类似, * 单是比它更加面向对象,两个线程执行 ...

  3. [置顶] 深入探析Java线程锁机制

    今天在iteye上提了一个关于++操作和线程安全的问题,一位朋友的回答一言点醒梦中人,至此我对Java线程锁有了更加深刻的认识.在这里也做个总结供大家参考. 先看几段代码吧! 代码一: public  ...

  4. Java线程锁&分布式锁的理解及应用

    了解Java线程锁之前,先理解线程和进程的定义.进程是操作系统分配资源(CPU)的基本单位,线程是CPU执行的基本单位,一个进程可拥有多个线程,同进程间的多个线程共享分配给进程的资源.比如启动JVM时 ...

  5. 工作常用4种Java线程锁的特点,性能比较、使用场景

    多线程的缘由 在出现了进程之后,操作系统的性能得到了大大的提升.虽然进程的出现解决了操作系统的并发问题,但是人们仍然不满足,人们逐渐对实时性有了要求. 使用多线程的理由之一是和进程相比,它是一种非常花 ...

  6. Java线程锁,synchronized、wait、notify详解

    (原) JAVA多线程这一块有点绕,特别是对于锁,对锁机制理解不清的话,程序出现了问题也很难找到原因,在此记录一下线程的执行以及各种锁. 1.JAVA中,每个对象有且只有一把锁(lock),也叫监视器 ...

  7. JAVA线程锁-读写锁应用,简单的缓存系统

    在JAVA1.5版本以后,JAVA API中提供了ReadWriteLock,此类是一个接口,在它的实现类中ReentrantReadWriteLock中有这样一段代码 class CachedDat ...

  8. Java 线程锁机制 -Synchronized Lock 互斥锁 读写锁

    (1)synchronized 是互斥锁: (2)ReentrantLock 顾名思义 :可重入锁 (3)ReadWriteLock :读写锁 读写锁特点: a)多个读者可以同时进行读b)写者必须互斥 ...

  9. JAVA线程锁lock下Condition的使用

    import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.uti ...

随机推荐

  1. 前端十万个为什么(之一):我们为什么需要npm?

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px ".PingFang SC"; color: #454545 } span ...

  2. yum 源问题

    YUM源搭建 1.yum源是yum安装的获取源地,yum  = 红帽包管理 echo /dve/sr0 /media ios9660 defaults 0 0 >> /etc/fstab ...

  3. PHP输出函数print, printf, sprintf的区别

    PHP中常用的字符串输出方式是:使用echo和print两种方法来显示字符串.如果涉及格式化输出操作,还可以试用printf和sprintf函数. 一.先说echo和print两种方法 print的语 ...

  4. hexo博客MathJax公式渲染问题

    这个问题自己很早以前便碰到了,用MathJax语法写的一些公式,在本地Markdown编译器上渲染是没问题的,可是部署到hexo博客中就出现问题了,之前我是使用图片代替公式应付过去了,今天从网上找了一 ...

  5. POJ 2386 Lake Counting (简单深搜)

    Description Due to recent rains, water has pooled in various places in Farmer John's field, which is ...

  6. mysql 触发器(trigger)

    触发器(trigger):监视某种情况,并触发某种操作. 触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/befo ...

  7. Eclipse的操作技巧

    网上已经有很多这类文章了,而且写的很全. 我最近刚开始使用Eclipse,写这篇文章的目的是在熟悉的过程中慢慢添加我用着顺手的一些技巧,以免因为某些原因更换开发环境后会忘记. 一.设置:窗口-首选项- ...

  8. 版本管理工具Git(2)git的安装及使用

    下载安装git 官方下载地址:https://git-scm.com/download/win 这里以windows为例,选择正确的版本: 验证是否安装成功,右键菜单中会出现如下菜单: Git工作流程 ...

  9. ubuntu创建wifi热点(android可识别)亲测可用

    转自http://jingyan.baidu.com/article/ea24bc39b03fc6da62b331f0.html 如何在ubuntu系统下创建android可识别热点?一般环境下创建的 ...

  10. linux下访问windows的共享

    linux下,要访问windows的共享,有好几种情况,下面进行总结. 外面的文章,有点介绍需要使用samba,有点说什么都不需要,只需要mount加上参数, 功能是实现,不过原理,还是不太明白,我发 ...