当前位置: 首页 > wzjs >正文

东莞网站建设兼职竞价排名采用什么计费方式

东莞网站建设兼职,竞价排名采用什么计费方式,群晖的网站开发,微信公众平台开发实例教程synchronized 和 ReentrantLock 都是 Java 中用于实现线程同步的机制,它们的主要目的都是确保在多线程环境下对共享资源的安全访问,但在多个方面存在差异。下面将从多个维度对二者进行详细对比解析。 语法与使用方式 synchronized synchronized 是 Ja…

synchronized 和 ReentrantLock 都是 Java 中用于实现线程同步的机制,它们的主要目的都是确保在多线程环境下对共享资源的安全访问,但在多个方面存在差异。下面将从多个维度对二者进行详细对比解析。

语法与使用方式

synchronized

synchronized 是 Java 的关键字,使用起来较为简洁,有以下三种使用方式:

同步实例方法

修饰实例方法时,锁对象是当前实例。

public class SynchronizedInstanceMethod {private int count = 0;public synchronized void increment() {count++;}
}

同步静态方法

修饰静态方法时,锁对象是当前类的 Class 对象。

public class SynchronizedStaticMethod {private static int count = 0;public static synchronized void increment() {count++;}
}

同步代码块

可以指定锁对象。

public class SynchronizedBlock {private int count = 0;private final Object lock = new Object();public void increment() {synchronized (lock) {count++;}}
}

锁的获取和释放由 JVM 自动处理,开发者无需手动干预。

ReentrantLock

ReentrantLock 是 java.util.concurrent.locks 包下的一个类,使用时需要手动获取和释放锁,通常结合 try-finally 语句确保锁一定会被释放。

import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockExample {private int count = 0;private final ReentrantLock lock = new ReentrantLock();public void increment() {lock.lock();try {count++;} finally {lock.unlock();}}
}

锁的特性

可重入性

二者都具备可重入性,即同一个线程可以多次获取同一把锁而不会被阻塞。

  • synchronized:当一个线程已经获取了某个对象的锁,再次请求该对象的锁时可以直接获得。
public class SynchronizedReentrant {public synchronized void method1() {System.out.println("Method 1");method2();}public synchronized void method2() {System.out.println("Method 2");}
}
  • ReentrantLock:同样支持可重入,重入次数会被记录,每次释放锁时重入次数减 1,直到重入次数为 0 时锁才真正被释放。
import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockReentrant {private final ReentrantLock lock = new ReentrantLock();public void method1() {lock.lock();try {System.out.println("Method 1");method2();} finally {lock.unlock();}}public void method2() {lock.lock();try {System.out.println("Method 2");} finally {lock.unlock();}}
}

公平性

  • synchronized:是非公平锁,线程获取锁的顺序是不确定的,可能会导致某些线程长时间得不到锁,出现线程饥饿现象。
  • ReentrantLock:可以通过构造函数指定是否为公平锁。公平锁会按照线程请求锁的顺序依次获取锁,避免了线程饥饿问题,但公平锁的性能相对较低。
import java.util.concurrent.locks.ReentrantLock;public class FairReentrantLock {private final ReentrantLock fairLock = new ReentrantLock(true);public void doSomething() {fairLock.lock();try {// 执行操作} finally {fairLock.unlock();}}
}

锁的获取与释放控制

synchronized

锁的获取和释放是隐式的,由 JVM 自动完成。当线程进入 synchronized 修饰的方法或代码块时,自动获取锁;当线程退出时,自动释放锁。开发者无法控制锁的获取和释放时机。

ReentrantLock

提供了更灵活的锁控制:

  • 可中断的锁获取:可以使用 lockInterruptibly() 方法在获取锁的过程中响应中断。
import java.util.concurrent.locks.ReentrantLock;public class InterruptibleLock {private final ReentrantLock lock = new ReentrantLock();public void doTask() throws InterruptedException {lock.lockInterruptibly();try {// 执行任务} finally {lock.unlock();}}
}
  • 尝试非阻塞获取锁:使用 tryLock() 方法尝试获取锁,如果锁可用则获取锁并返回 true,否则返回 false,不会阻塞线程。还可以使用 tryLock(long timeout, TimeUnit unit) 方法在指定时间内尝试获取锁。
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;public class TryLockExample {private final ReentrantLock lock = new ReentrantLock();public void tryToLock() {if (lock.tryLock()) {try {// 执行操作} finally {lock.unlock();}} else {// 锁不可用,执行其他操作}}public void tryToLockWithTimeout() throws InterruptedException {if (lock.tryLock(1, TimeUnit.SECONDS)) {try {// 执行操作} finally {lock.unlock();}} else {// 超时未获取到锁,执行其他操作}}
}

条件变量支持

synchronized

只能使用 wait()、notify() 和 notifyAll() 方法进行线程间的等待 - 通知机制,这些方法是基于对象的监视器,功能相对有限。

public class SynchronizedWaitNotify {private final Object lock = new Object();private boolean condition = false;public void waitForCondition() throws InterruptedException {synchronized (lock) {while (!condition) {lock.wait();}// 条件满足,执行操作}}public void signalCondition() {synchronized (lock) {condition = true;lock.notifyAll();}}
}
ReentrantLock

通过 newCondition() 方法可以返回一个与该锁关联的 Condition 对象,一个 ReentrantLock 可以关联多个 Condition 对象,实现更精细的线程间通信。

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;public class ReentrantLockCondition {private final ReentrantLock lock = new ReentrantLock();private final Condition notFull = lock.newCondition();private final Condition notEmpty = lock.newCondition();private final int[] buffer = new int[10];private int count = 0;private int in = 0;private int out = 0;public void put(int value) throws InterruptedException {lock.lock();try {while (count == buffer.length) {notFull.await();}buffer[in] = value;in = (in + 1) % buffer.length;count++;notEmpty.signal();} finally {lock.unlock();}}public int take() throws InterruptedException {lock.lock();try {while (count == 0) {notEmpty.await();}int value = buffer[out];out = (out + 1) % buffer.length;count--;notFull.signal();return value;} finally {lock.unlock();}}
}

性能差异

synchronized

在早期版本中,synchronized 的性能较差,因为它使用的是重量级锁,线程的阻塞和唤醒需要操作系统的介入。但在 Java 6 之后,JVM 对 synchronized 进行了大量优化,引入了偏向锁、轻量级锁等机制,在并发程度不高的情况下,性能与 ReentrantLock 相差不大。

ReentrantLock

在高并发场景下,ReentrantLock 可以通过更灵活的锁控制和可中断、尝试获取锁等特性,避免线程长时间阻塞,从而提高性能。但如果使用不当,手动管理锁的开销可能会导致性能下降。

总结

  • synchronized:使用简单,适合对代码简洁性要求较高、并发程度不是特别高的场景,JVM 会自动处理锁的获取和释放。
  • ReentrantLock:功能更强大,提供了更灵活的锁控制、公平锁、可中断锁获取和多个条件变量等特性,适合对锁的控制要求较高、并发场景复杂的情况,但需要手动管理锁的获取和释放。
http://www.dtcms.com/wzjs/83325.html

相关文章:

  • 成都工业学院文献检索在哪个网站做搜索引擎广告图片
  • 目前全球新冠疫情情况徐州百度seo排名优化
  • 网络代理什么意思重庆seo俱乐部
  • 南昌网站seo费用西安百度百科
  • 潜江做网站潍坊百度网站排名
  • wordpress中文问答模块如何优化seo技巧
  • 微信网站制作合同网络营销有哪些特点
  • wordpress子站点解析济南网络推广
  • 举例说明网络营销的方法win7优化大师官网
  • 网页设计与网站开发试卷企业网站seo案例
  • 欧米伽官方网站手表价格石家庄今日头条新闻
  • 广东网站建设哪家专业进行seo网站建设
  • 乐清网站制作电话长沙网站开发
  • 怎么自己做网站服务器linux宁波seo营销
  • 做的最好的美女视频网站有哪些百度推广费用一年多少钱
  • wordpress basedir武汉seo网站优化技巧
  • 网站建设怎么报价优化大师的功能有哪些
  • 网站如何设置广告网站推广优化怎么做最好
  • 学校网站群管理系统建设项目西安百度关键词推广
  • esc怎么做网站免费视频外链生成推荐
  • 做色情灰色网站怎么判刑疫情防控数据
  • 国家企业信用信息公示系统官网站网络推广seo教程
  • 布吉网站建设经典软文范例大全
  • 电子商务网站建设的规划和实施上海推广网络营销咨询热线
  • 招工网站58同城办公软件速成培训班
  • 网站开发 荣誉资质大连网站优化
  • 武汉住房和城乡建设厅网站网络营销推广是做什么的
  • iis默认网站路径网络营销出来做什么
  • 用pycharm做网站百度中心人工电话号码
  • 美女做暖暖视频的网站seo人员的相关薪资