Java进阶(8) - 并发(多线程锁类)

一共有3类锁 ,方法锁、对象锁、类锁。(方法锁也是对象锁的一种)
一、对象锁
对象锁
public class object {
private Lock lock = new ReentrantLock();//JavaSE1.5.新增了一个java.util.concurrent包来支持同步
public void method(){
synchronized(this){
System.out.println("我是对象锁");
}
}
}

public synchronized void method(){ //默认使用类实例this当做锁
System.out.println("我是对象锁也是方法锁");
}
这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中只有一个可执行,从而有效避免了类成员变量的访问冲突

二、类锁
一个class的静态方法和静态变量在内存中只会加载和初始化一份,一旦一个静态的方法被申明为synchronized,此类的所有的实例化对象在调用该方法时,共用同一把锁,称之为类锁。
形式一:
public class object {
public static synchronized void method(){
System.out.println("我是第一种类锁");
}
}

形式二:
public class object {
public void method(){
synchronized (object.this) {
System.out.println("我是第二种类锁");
}
}
}

三、类锁
ReentrantLock
Lock.lock() 当前线程尝试获取一个锁,如果这个锁获取不到,则当前线程会一直休眠直到获取这个锁.
Lock.lockInterruptibly() 让当前线程获取一个锁,如果锁可以用,则直接返回.否则当前线程会一直休眠直到一下两种情况中的其中一个发生:
当前线程获取到这个锁
其他线程打断当前线程, 打断当前线程获取锁的操作是允许的.
Lock.tryLock() 尝试获得一个锁,如果锁是可用的,则直接返回ture,并获取到这个锁.否则,直接返回false
Lock.tryLock(long time, TimeUnit unit) 在某一段时间内尝试获取一个锁,如果锁可用,则直接返回true,否则等待超时返回fasle
Lock.unlock() 释放锁
Lock.newCondition()

原文地址:https://blog.51cto.com/4397014/2436898

时间: 2024-11-09 04:58:29

Java进阶(8) - 并发(多线程锁类)的相关文章

Java进阶(7) - 并发(多线程基本概念)

一.中断interrupt方法只改变目标线程的中断状态(interrupt status),当线程处于 wait.sleep.join等状态时都在方法内部不断地检查中断状态的值,当调用interrupt会抛出InterruptedException异常. interrupt方法Thread实例方法: 必须由其它线程获取被调用线程的实例后,进行调用.实际上,只是改变了被调用线程的内部中断状态: Thread.interrupted方法Thread类方法: 必须在当前执行线程内调用,该方法返回当前线

Java基础】并发 - 多线程

Java基础]并发 - 多线程 分类: Java2014-05-03 23:56 275人阅读 评论(0) 收藏 举报 Java 目录(?)[+] 介绍 Java多线程 多线程任务执行 大多数并发应用程序时围绕执行任务(task)进行管理的:所谓任务就是抽象的,离散的工作单元. 围绕执行任务来管理应用程序时,第一步是要指明一个清晰的任务边界.大多数应用服务器程序都选择了下面这个自然的任务辩解:单独的客户请求: 任务时逻辑上的单元: 任务 Runnable 表示一个任务单元(java.lang)

java处理高并发高负载类网站的优化方法

一:高并发高负载类网站关注点之数据库 没错,首先是数据库,这是大多数应用所面临的首个SPOF.尤其是Web2.0的应用,数据库的响应是首先要解决的. 一般来说MySQL是最常用的,可能最初是一个mysql主机,当数据增加到100万以上,那么,MySQL的效能急剧下降.常用的优化措施是M-S(主-从)方式进行同步复制,将查询和操作和分别在不同的服务器上进行操作.我推荐的是M-M-Slaves方式,2个主Mysql,多个Slaves,需要注意的是,虽然有2个Master,但是同时只有1个是Activ

Java进阶(2) - 特殊对象(Class类)

存在的意义位于java.lang包下,和java.lang.reflect包下的类共同支持java反射功能jvm在类加载时,在堆中为每个类生成一个Class对象,用于记录每个类的属性.方法等信息,同时每个对象生成时都有特殊的标记位来指向堆中的Class对象. 获取的三种方式1 .Class.forName("全路径名")2 .类名.Class3?.实例对象.getClass() ?常用方法列表1.getName():返回String形式的该类的名称.?2.newInstance():根

Java面试03|并发及锁

1.synchronized与Lock的区别 使用synchronized这个关键字实现的同步块有一些缺点: (1)锁只有一种类型 (2)线程得到锁或者阻塞 (3)Lock是在Java语言层面基于CAS自旋方式来实现锁的,在并发条件下,其性能要相对比synchronized好一些. 为了解决如上的各种问题,后来又提出了一种更为复杂的锁 - 线程锁.线程锁可以在几个方面进行提升: (1)添加不同类型的锁,如读取锁和写入锁(主要实现类为ReentrantReadWriteLock类) (2)对锁的阻

Java面试41-45|并发及锁

41.synchronized与Lock的区别 使用synchronized这个关键字实现的同步块有一些缺点: (1)锁只有一种类型 (2)线程得到锁或者阻塞 (3)Lock是在Java语言层面基于CAS自旋方式来实现锁的,在并发条件下,其性能要相对比synchronized好一些. 为了解决如上的各种问题,后来又提出了一种更为复杂的锁 - 线程锁.线程锁可以在几个方面进行提升: (1)添加不同类型的锁,如读取锁和写入锁(主要实现类为ReentrantReadWriteLock类) (2)对锁的

Java进阶(6) - 并发(关键字)

并发的特性1.可见性a. 保证任何一个线程修改变量立即写入到主内存中(堆):b. 所有线程对该变量引用会强制立即失效,并且该线程必须去堆中获取最新的变量值. 2.指令重排序代码的执行顺序 会在JVM中(编译器优化 指令级并行重排序 内存系统重排序 最终执行的指令序列) 3.原子性同一时刻最多只有一个线程访问该段代码. Volatile -> 可见性.指令重排序 Synchronied -> 可见性.指令重排序.原子性 lock存在价值synchronized只在以下2种情况下会释放锁1)获取锁

Java进阶(三)多线程开发关键技术

原创文章,转载请务必将下面这段话置于文章开头处. 本文转发自Jason's Blog,原文链接 http://www.jasongj.com/java/multi_thread/ sleep和wait到底什么区别 其实这个问题应该这么问--sleep和wait有什么相同点.因为这两个方法除了都能让当前线程暂停执行完,几乎没有其它相同点. wait方法是Object类的方法,这意味着所有的Java类都可以调用该方法.sleep方法是Thread类的静态方法. wait是在当前线程持有wait对象锁

synchronized与static synchronized 的差别、synchronized在JVM底层的实现原理及Java多线程锁理解

本Blog分为例如以下部分: 第一部分:synchronized与static synchronized 的差别 第二部分:JVM底层又是怎样实现synchronized的 第三部分:Java多线程锁,源码剖析 第一部分:synchronized与static synchronized的差别 1.synchronized与static synchronized 的差别 synchronized是对类的当前实例进行加锁,防止其它线程同一时候訪问该类的该实例的全部synchronized块.注意这里