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

公司网站域名及空间wordpress怎么引用图片

公司网站域名及空间,wordpress怎么引用图片,中小学做课题研究的网站,网站建设明薇通网络👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 👍 欢迎点赞、收藏、关注,跟上我的更新节奏 📚欢迎订阅专栏…

👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD
🔥 2025本人正在沉淀中… 博客更新速度++
👍 欢迎点赞、收藏、关注,跟上我的更新节奏
📚欢迎订阅专栏,专栏别名《在2B工作中寻求并发是否搞错了什么》

文章目录

  • 前言
  • 入门
    • 什么是synchronized?
    • 为什么用synchronized?
    • 怎么用synchronized?
      • 修饰方法
      • 修饰代码块
  • syncrhonized在框架源码中的使用
    • Vector 和 Hashtable
    • StringBuffer
  • 总结
    • synchronized的优点
    • synchronized的缺点
    • synchronized的适用场景
  • 后话
  • 参考

前言

这一篇同样是sychronzied的入门篇,不会涉及底层原理和实现,很适合初学者的学习。好了, 不废话了,让我们马上开始吧🤗

入门

什么是synchronized?

synchronized 是 Java 中的关键字,用于实现线程同步,确保多个线程在访问共享资源时不会发生冲突。它可以修饰方法或代码块,保证同一时间只有一个线程执行被修饰的代码,从而避免数据不一致问题。

为什么用synchronized?

  1. 解决竞态条件(Race Condition)

问题:多个线程同时修改同一个共享变量时,操作顺序可能被打乱,导致结果不可预测。
如果两个线程同时调用 increment(),可能发生以下情况:线程 A 读取 count=0 → 线程 B 也读取 count=0 → 两者都改为 1 → 最终 count=1(实际应为 2)。

// 有问题的count++
public class Counter {private int count = 0;public void increment() {count++; // 这行代码实际包含三步:读取值 → 修改值 → 写回值}
} 

解决:使用synchronized解决,synchronized确保同一时刻只有一个线程能执行increment(),避免值被覆盖。

public class Counter {private int count = 0;// 添加 synchronized 关键字public synchronized void increment() {count++; // 现在是一个原子操作}
}
  1. 保证内存可见性

问题:线程有自己的工作内存(缓存),修改共享变量后可能不会立即同步到主内存,导致其他线程看到旧值。

// 存在问题的flag读和写方法
public class VisibilityDemo {private boolean flag = false;public void setFlag() {flag = true; // 线程 A 修改 flag}public void checkFlag() {while (!flag); // 线程 B 可能永远看不到 flag 变为 true}
}

解决:使用synchronized解决,通过 synchronized 的锁机制,强制线程从主内存读取最新值,避免可见性问题。

public class VisibilityDemo {private boolean flag = false;// 添加 synchronized 保证可见性public synchronized void setFlag() {flag = true; // 修改后立即同步到主内存}// 同样用 synchronized 读取public synchronized boolean checkFlag() {return flag; // 从主内存读取最新值}
}
  1. 避免原子性破坏

问题:某些操作看似是“一步完成”,但实际由多个底层指令组成(如 i++),多线程环境下可能被分割执行,比如下面的转账例子。

// 非原子操作
public void transfer(Account from, Account to, int amount) {if (from.balance >= amount) {from.balance -= amount; // 非原子操作to.balance += amount;    // 可能被其他线程打断}
}

解决:使用synchronized解决。这里更安全的做法是使用全局锁(如定义一个 final Object lock),避免嵌套锁导致的死锁风险。

public void transfer(Account from, Account to, int amount) {// 锁定两个账户对象,避免并发修改synchronized (from) {synchronized (to) {if (from.balance >= amount) {from.balance -= amount;to.balance += amount;}}}
}
  1. 协调多线程的有序访问

问题:多个线程需要按特定顺序操作共享资源(如生产者-消费者模型)。

public class Queue {private List<Integer> list = new ArrayList<>();public synchronized void add(int value) {list.add(value); // 生产者线程添加数据}public synchronized int remove() {return list.remove(0); // 消费者线程移除数据}
}

解决synchronized 确保同一时刻只有一个线程操作队列,避免并发异常。

public class Queue {private List<Integer> list = new ArrayList<>();// 添加和移除方法均用 synchronized 保护public synchronized void add(int value) {list.add(value);}public synchronized int remove() {if (!list.isEmpty()) {return list.remove(0);}return -1; // 或抛异常}
}

怎么用synchronized?

我们可以看到,JLS已经规定了,可以修饰在方法和代码块中。
在这里插入图片描述

修饰方法

1.修饰实例方法
锁是当前对象实例(this),同一对象的多个线程调用该方法时会互斥。

public class Counter {private int count = 0;// 修饰实例方法:锁是当前对象实例public synchronized void increment() {count++;}
}

使用场景:多个线程操作同一个对象的实例方法时(如单例对象的资源修改)。

2.修饰静态方法
锁是类的 Class 对象(如 Counter.class),所有线程调用该类的静态方法时会互斥。

public class Counter {private static int count = 0;// 修饰静态方法:锁是 Counter.classpublic static synchronized void increment() {count++;}
}

使用场景:多线程操作静态变量(如全局计数器)。

修饰代码块

可以指定任意对象作为锁,灵活性更高。

1.锁是当前对象实例(this)

public void doSomething() {// 同步代码块:锁是当前对象实例synchronized (this) {// 需要同步的代码}
}

2.锁是类对象(Class)

public void doSomething() {// 同步代码块:锁是 Counter.classsynchronized (Counter.class) {// 需要同步的代码}
}

3.锁是任意对象

private final Object lock = new Object();public void doSomething() {// 同步代码块:锁是自定义对象synchronized (lock) {// 需要同步的代码}
}

syncrhonized在框架源码中的使用

Vector 和 Hashtable

这些类在 JDK 早期版本中通过synchronized修饰所有公共方法实现线程安全。例如Vectoradd() 方法:

public synchronized boolean add(E e) {modCount++;ensureCapacityHelper(elementCount + 1);elementData[elementCount++] = e;return true;
}

缺点:锁粒度粗(整个方法加锁),性能较低,现代开发中多被ConcurrentHashMapCollections.synchronizedList()替代。

StringBuffer

StringBuffer的方法均用synchronized修饰以实现线程安全,例如append()

public synchronized StringBuffer append(String str) {toStringCache = null;super.append(str);return this;
}

总结

synchronized的优点

  1. 简单易用
    • 只需在方法或代码块上添加关键字即可实现线程同步,无需手动管理锁的获取和释放。
  2. 自动释放锁
    • 当同步代码块执行完毕或发生异常时,锁会自动释放,避免死锁风险。
  3. 内置锁优化
    • JVM 对 synchronized 进行了大量优化,如锁升级机制(偏向锁 → 轻量级锁 → 重量级锁),在低竞争场景下性能较好。
  4. 内存可见性
    • 通过 synchronized 的锁机制,可以保证线程对共享变量的修改对其他线程可见(遵循 happens-before 原则)。
  5. 结构化锁
    • 锁的获取和释放必须成对出现,减少编码错误。

synchronized的缺点

  1. 性能开销
    • 在高竞争场景下,synchronized 会升级为重量级锁,导致线程阻塞和上下文切换,性能较差。
  2. 锁粒度较粗
    • 如果直接修饰方法,可能导致锁的范围过大,降低并发性能。
  3. 不可中断
    • 线程在等待锁时无法被中断(Lock 接口支持可中断的锁获取)。
  4. 功能有限
    • 不支持尝试获取锁(tryLock)、超时获取锁、公平锁等高级功能(ReentrantLock 支持)。
  5. 嵌套锁可能导致死锁
    • 如果多个线程以不同顺序获取嵌套锁,可能导致死锁。

synchronized的适用场景

  1. 低竞争场景
    • 当线程竞争不激烈时,synchronized 的性能足够好,且实现简单。
  2. 简单的线程同步需求
    • 如计数器、单例模式、简单的生产者-消费者模型等。
  3. 需要快速实现线程安全
    • 在开发初期或对性能要求不高的场景下,synchronized 是快速实现线程安全的有效工具。
  4. 需要保证内存可见性
    • 当多个线程需要共享变量时,synchronized 可以确保变量的修改对其他线程可见。
  5. 锁粒度较粗的场景
    • 如果锁的范围不需要特别精细,直接修饰方法即可满足需求。

后话

什么就结束了?别急,这个synchronized的原理,也是很有说法的。

点上关注,主播马上带你们深入学习synchronized

最近主播的下班时间都是准点,这下沉淀爽了🤗

参考

Chapter 17. Threads and Locks


文章转载自:

http://SPNFhqsl.trzzm.cn
http://z9GVSRpk.trzzm.cn
http://cRCi0pBO.trzzm.cn
http://lYBEN2xA.trzzm.cn
http://j7DYVfIK.trzzm.cn
http://en57cNgk.trzzm.cn
http://IilmPz8F.trzzm.cn
http://m9VFPR4W.trzzm.cn
http://W7vy2Yno.trzzm.cn
http://X2kw0aV1.trzzm.cn
http://cV9VH0NO.trzzm.cn
http://MT6nUl36.trzzm.cn
http://QWIuK4cg.trzzm.cn
http://A2jls5B1.trzzm.cn
http://7ZINJeHS.trzzm.cn
http://lymUQHSV.trzzm.cn
http://U5MlxEMf.trzzm.cn
http://HDm17qO0.trzzm.cn
http://i3nPhV3g.trzzm.cn
http://kl9Hm9Hn.trzzm.cn
http://KIuCZaJw.trzzm.cn
http://XkQkB99j.trzzm.cn
http://wxyOOW2K.trzzm.cn
http://3WmlDutK.trzzm.cn
http://v9DTaO3B.trzzm.cn
http://dISeRtNC.trzzm.cn
http://RrvuNMAo.trzzm.cn
http://Vv5spa8B.trzzm.cn
http://xpgTqFRQ.trzzm.cn
http://fXsTikx1.trzzm.cn
http://www.dtcms.com/wzjs/641952.html

相关文章:

  • 嘉兴建设公司网站中国室内设计联盟图片
  • 网站在哪备案统计二级域名的网站流量有什么用
  • 什邡网站建设公司为什么做网站网站
  • 工业贸易企业 营销型网站网页跟网站的区别
  • 自己做的网站是怎么赚钱网站建设要注意什么
  • 无锡做百度网站seo网站诊断报告
  • 厦门网站建设网页设计网上商城系统软件
  • 网站建设 有哪些费用设计师网名怎么取
  • 外贸网站自我建设与优化宁波网站制作联系方式
  • 深圳网站建设明细报价表不忘初心网站建设
  • 医疗网站平台建设方案企业培训公司有哪些
  • 公司资质查询官方网站惠州seo建站
  • 专注于上海seo做网站建设出入成都最新通知今天
  • 乌兰县wap网站建设公司wordpress分库技术
  • 网站建设与维护就业前景wordpress采集插件 免费
  • 网站开发销售简历范文wordpress读取字体
  • 网站开发合同注意事件有哪些贵州城乡和住房建设厅网站
  • 龙门石窟网站建设策划报告wordpress增加下载量显示
  • 怎么开发微信网站wordpress 转移文章
  • 强比网站建设宁波网络营销外包推广
  • 深圳网站开发报价用新域名做网站排名快吗
  • 自己做网站推广如何注册公司营业执照
  • 潍坊网站seo织梦系统做网站
  • 常用网站缩略图自定义网站备案的意义
  • 公司用员工信息做网站域名备案11网站建设waocc
  • 做 了一个 家教 网站易语言做网站爆破工具
  • nginx wordpress 多站点手机影视网站开发
  • 成都网站原创百度账号怎么改用户名
  • 长春网站排名网站开发协议百度
  • 宣武上海网站建设青海公司网页设计