码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-09-10 01:22:28      阅读:98      评论:0      收藏:0      [点我收藏+]

标签:有一个   静态   声明   cond   obj   syn   stat   操作   interrupt   

一共有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()

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

标签:有一个   静态   声明   cond   obj   syn   stat   操作   interrupt   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!