并发(3) - 关键字

一、并发特性

1、可见性

a、 保证任何一个线程修改变量立即写入到主内存中(堆);

b、 所有线程对该变量引用会强制立即失效,并且该线程必须去堆中获取最新的变量值。

 

2、指令重排序

代码的执行顺序 会在JVM中(编译器优化 指令级并行重排序 内存系统重排序 最终执行的指令序列)

 

3、原子性

同一时刻最多只有一个线程访问该段代码。

 

二、Volatile

-> 可见性、指令重排序

 

三、Synchronied

-> 可见性、指令重排序、原子性

 

四、lock

存在价值

synchronized只在以下2种情况下会释放锁

1)获取锁的线程执行完了该代码块,然后线程释放对锁的占有;

2)线程执行发生异常,此时JVM会让线程自动释放锁。

因此synchronized可能会造成线程阻塞。

为解决线程阻塞问题,引入此概念。

public interface Lock {

void lock();//获取锁,如果锁被其他线程获取,则进行等待

void lockInterruptibly() throws InterruptedException;
// tryLock()方法是有返回值的,它表示用来尝试获取锁,如果获取成功,则返回true,如果获取失败(即锁已被其他线程获取),则返回 false,也就说这个方法无论如何都会立即返回。在拿不到锁时不会一直在那等待。
    boolean tryLock();
//tryLock(long time, TimeUnit unit)方法和tryLock()方法是类似的,只不过区别在于这个方法在拿不 到锁时会等待一定的时间,在时间期限之内如果还拿不到锁,就返回false。如果如果一开始拿到锁或者在等待期间内拿到了锁,则返回true
    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
    void unlock(); //释放锁
    Condition newCondition();

}

 

五、ReentrantLock

ReenTrantLock的实现是一种自旋锁,通过循环调用CAS操作来实现加锁

1.可中断锁等待

在等待锁的过程中,线程可以取消对锁的请求。(重入锁)

2.锁的定时等待

锁的定时等待,就是给锁设定一个等待时间。如果过了等待时间线程还没有获取锁,那么线程就自动放弃获取该锁。

3.公平锁

 

六、Final

      final修饰的变量不可改变,在并发编程场景下性能突出。

 

七、其它

1、volatile和synchronied区别

volatile不会造成线程的阻塞,而synchronized可能会造成线程的阻塞。(原子性差异造成)

volatile只能修饰变量,而synchronized则可以修饰变量和方法。

当一个域的值依赖于它之前的值时,volatile就无法工作了,如n=n+1,n++等。如果某个域的值受到其他域的值的限制,那么volatile也无法工作,如Range类的lower和upper边界,必须遵循lower<=upper的限制。

使用volatile而不是synchronized的唯一安全的情况是类中只有一个可变的域。

 

2、synchronized和lock区别

Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现;

synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;

Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;

通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。

Lock可以提高多个线程进行读操作的效率。

在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。所以说,在具体使用时要根据适当情况选择。

3、synchronized 和 ReentrantLock区别

https://blog.csdn.net/tiny__wang/article/details/91409001

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值