【Java进程线程、synchronized关键字】线程与进程,synchronized与ReentrantLock的原理和区别


一、线程与进程

进程是程序的一次执行,是操作系统进行资源分配和调度的独立单位,他的作用是是使多个程序能够并发执行,提高资源利用率和系统吞吐率。

由于进程是资源分配和调度的基本单位,因为进程的创建、销毁、切换产生大量的时间和空间的开销,进程的数量不能太多,而线程是比进程更小的能独立运行的基本单位,他是进程的一个实体,可以减少程序并发执行时付出的时空开销,使得操作系统具有更好的并发性。

线程基本不拥有系统资源,只有一些运行时必不可少的资源,比如程序计数器、寄存器和栈,进程由程序段、相关数据段和进程控制块组成。

线程与进程的比较

①调度:线程作为调度和分派的基本单位,而进程作为资源拥有的基本单位。
②并发性:进程之间可以并发执行,进程中的多个线程之间亦可并发执行。
③拥有资源:进程是系统中拥有资源的基本单位,进程的地址空间互相独立。线程本身不拥有系统资源(仅一点点)。同一进程的线程共享进程资源。
④系统开销:线程的切换仅需保存和设置少量寄存器内容,切换代价低于进程。
⑤通信方面:进程需用同步互斥等辅助,线程可以直接读写进程数据段(如全局变量)来通信。

二、synchronized、ReentrantLock原理及区别

1、synchronized使用方法及原理

(1)synchronized的使用

在Java中,使用修饰符synchronized来为被保护资源加锁。synchronized只能用来说明方法和代码段不能用它来说明类和成员变量。用synchronized修饰的方法和代码段称为方法同步和代码段同步。方法同步仅在该方法前加上synchronized修饰符即可。
上代码:

// 关键字在实例方法上,锁为当前实例
public synchronized void examplelock() {
    
    
	...
}

// 关键字在静态方法上,锁为当前Class对象
public static synchronized void classlock() {
    
    
	...
}

// 关键字在代码块上,锁为括号里面的对象
public void blocklock() {
    
    
    Object o = new Object();
    synchronized (o) {
    
    
        ...
    }
}

(2)synchronized的原理

synchronized是java提供的原子性内置锁,使用synchronized之后,会在编译之后在同步的代码块前后加上monitorenter和monitorexit字节码指令,他依赖操作系统底层互斥锁实现。他的作用主要就是实现原子性操作和解决共享变量的内存可见性问题。

执行monitorenter指令时会尝试获取对象锁,如果对象没有被锁定或者已经获得了锁,锁的计数器+1。此时其他竞争锁的线程则会进入等待队列中。

执行monitorexit指令时则会把计数器-1,当计数器值为0时,则锁释放,处于等待队列中的线程再继续竞争锁。
在这里插入图片描述

synchronized是排它锁,当一个线程获得锁之后,其他线程必须等待该线程释放锁后才能获得锁,意味着同一时刻该方法或代码段只能被一个线程执行,其它想执行该方法或代码段的线程必须等待。而且由于Java中的线程和操作系统原生线程是一一对应的,线程被阻塞或者唤醒时时会从用户态切换到内核态,这种转换非常消耗性能。

2、ReentrantLock原理

ReentrantLock是基于AQS(AbstractQueuedSynchronizer 抽象队列同步器)实现

AQS内部有一个state状态位,尝试加锁的时候通过CAS(CompareAndSwap)修改值,如果成功设置为1,并且将当前线程ID赋值,则代表加锁成功,一旦获取到锁,其他的线程将会被阻塞进入阻塞队列,当获得锁的线程释放锁后,会唤醒阻塞队列中的线程,释放锁的时候会同时吧state重新置为0,当前线程ID置为空。
在这里插入图片描述

3、synchronized和ReentrantLock的区别

(1)相比于synchronized,ReentrantLock需要显式的获取锁和释放锁。
(2)等待可中断,当持有锁的线程长时间不释放锁的时候,等待中的线程可以选择放弃等待,转而处理其他的任务。
(3)公平锁:synchronized和ReentrantLock默认都是非公平锁,但是ReentrantLock可以通过构造函数传参改变。只不过使用公平锁的话会导致性能急剧下降。
(4)绑定多个条件:ReentrantLock可以同时绑定多个Condition条件对象。
(5)在效率方面,synchronized和ReentrantLock基本持平。


结语:开始自学Java,对着敖丙大佬的流程进行一个系统的学习,希望自己能够坚持!
大家如果要学习其他东西例如数据库、Java的集合框架啥的,也可以自己去看敖丙大佬的博客,打开CSDN搜索敖丙就看得到了。希望大家都有收获!
注:原文出处为https://mp.weixin.qq.com/s/-xFSHf7Gz3FUcafTJUIGWQ

猜你喜欢

转载自blog.csdn.net/qq_51720181/article/details/125581252