Synchronized代码详解?

简介: Synchronized代码详解?

synchronized是java的关键字,他有以下特性。

互斥性:同一个时间只允许一个线程获取到某个对象锁,这样就可以保证线程安全,同一时间只有一个线程可以对代码进行访问操作。互斥性也就是我们经常说的原子性。

可见性:必须保证在锁被释放前,对数据的修改 对其他线程是可见的,否则其他线程从其他地方获取数据导致不一致性。


synchronized是隐式锁,是jvm内置锁,不需要手动加锁与解锁,jvm会自动加锁跟解锁。

而lock则需要实现lock接口,需要手动加锁和解锁。


下面代码实例从三个方面进行加锁。

  1. 静态方法,锁的是类对象。
  2. 普通方法,锁的是实例对象。

(需要注意:在spring容器中,bean是单实例,否则加synchronized没什么意义)

  1. 代码块:锁的是括号里的对象。
/**
 * @author keying
 */
public class Synchronized822 {
    public static void main(String[] args) throws InterruptedException {
        ThreadTestNei threadTestNei = new ThreadTestNei();
        ThreadA threadA = new ThreadA(threadTestNei);
        threadA.setName("A-THREAD");
        threadA.start();
        ThreadB threadB = new ThreadB(threadTestNei);
        threadB.setName("B-THREAD");
        threadB.start();
    }
}
class ThreadA extends Thread {
    private ThreadTestNei threadTestNei;
    ThreadA(ThreadTestNei threadTestNei) {
        this.threadTestNei = threadTestNei;
    }
    @Override
    public void run() {
        super.run();
        threadTestNei.setUser();
    }
}
class ThreadB extends Thread {
    private ThreadTestNei threadTestNei;
    ThreadB(ThreadTestNei threadTestNei) {
        this.threadTestNei = threadTestNei;
    }
    @Override
    public void run() {
        super.run();
        threadTestNei.setUser();
    }
}
@Data
class ThreadTestNei {
    private String name;
    private String aString = new String();
    public void setUser() {
        try {
            synchronized (aString) {
                System.out.println(Thread.currentThread().getName() + "----" + "begin");
                Thread.sleep(1000);
                System.out.println(Thread.currentThread().getName() + "----" + "end");
            }
        } catch (Exception e) {
        }
    }
}

这时候他们修饰的是同一个对象,所以 输出是

A-THREAD----begin
A-THREAD----end
B-THREAD----begin
B-THREAD----end

当代码改为

try {
            String aString = new String();
            synchronized (aString) {
                System.out.println(Thread.currentThread().getName() + "----" + "begin");
                Thread.sleep(1000);
                System.out.println(Thread.currentThread().getName() + "----" + "end");
            }
        } catch (Exception e) {
        }

输出则是:

A-THREAD----begin
B-THREAD----begin
A-THREAD----end
B-THREAD----end

如果锁住的是类,则输出的是

try {
            synchronized (ThreadTestNei.class) {
                System.out.println(Thread.currentThread().getName() + "----" + "begin");
                Thread.sleep(1000);
                System.out.println(Thread.currentThread().getName() + "----" + "end");
            }
        } catch (Exception e) {
        }
A-THREAD----begin
A-THREAD----end
B-THREAD----begin
B-THREAD----end
相关文章
|
3月前
|
人工智能 安全 API
OpenClaw保姆级教程:阿里云/本地部署配置百炼Coding Plan API+核心Skill清单及常见问题解答
2026年,OpenClaw(昵称“小龙虾”)的核心价值早已不是“能聊天”,而是通过Skills(技能插件)连接工具、网站与系统,实现从“对话建议”到“落地执行”的跨越。但多数用户部署后陷入“装而不用”的困境——要么盲目堆砌技能导致功能冲突,要么忽视安全风险不敢用于关键场景。
1013 1
|
16天前
|
人工智能 自然语言处理 安全
阿里云百炼Token Plan和Coding Plan怎么选?一篇讲透区别与适用场景,告别纠结!
随着AI编程与智能体工具快速普及,阿里云百炼推出的订阅套餐成为开发者低成本使用大模型的主流选择。但很多用户在Token Plan与Coding Plan之间难以判断,再加上套餐状态频繁调整,很容易选错、买错、用错。本文基于2026年最新官方政策与真实使用体验,系统梳理两种套餐的定位、计费、模型支持、工具兼容性与实际限制,给出清晰可落地的选择建议,帮你一次性选对最适合自己的方案,不花冤枉钱、不踩不必要的坑。
641 4
|
2月前
|
人工智能 安全 数据挖掘
GitHub 14万星!Claude Code 从「会写代码」到「工程系统」的升级指南
小华同学专注AI工程化实践!「Everything Claude Code」是面向Claude等AI编程工具的开源系统,含47个代理、181个技能、79个命令,支持上下文持久化、验证闭环、安全扫描(AgentShield)与持续学习,助开发者将AI从“对话助手”升级为可交付、可沉淀的智能工程系统。(239字)
1146 1
|
3月前
|
人工智能 安全 前端开发
一个人如何同时指挥三个 AI 写代码?多模型协作实战
一个人如何同时指挥三个 AI 写代码? 不是三个终端窗口来回切,而是真正"协同"—— Claude 总指挥,Gemini 写前端,Codex 写后端。自动分工、交叉审查、安全可控。 CCG-Workflow 这个开源工具把想象变成了现实。零配置路由、规范驱动开发、外部模型只能建议不能执行。来看看怎么让你的 AI 编程效率翻倍。
1251 3
一个人如何同时指挥三个 AI 写代码?多模型协作实战
|
2月前
|
人工智能 自然语言处理 安全
阿里云百炼 Token Plan 与 Coding Plan:定位、差异与选择指南
阿里云百炼推出Token Plan(团队版)与Coding Plan(个人版)两大AI订阅服务:前者以Credits积分制支持多模态大模型,满足企业级资源管理、成本分摊与安全合规需求;后者按请求次数计费,专注代码生成,助力开发者低成本高效编程。精准匹配不同场景,降本增效。
1831 4
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
除夕夜,国产顶流压轴上线,QWEN3.5多模态开源!
加我进AI讨论学习群,公众号右下角“联系方式” 文末有老金的 **开源知识库地址·全免费** --- ![Image](https://ucc.alicdn.com/pic/developer-ecology/p3shvhj26rigq_682da514f2d84d68857b797ebe2fbced.jpg) 除夕夜,老金我刚咬了一口韭菜鸡蛋饺子。 手机"叮"的一声,弹出个通知。 老金我瞄
|
SQL NoSQL Java
Java使用sql查询mongodb
通过使用 MongoDB Connector for BI 和 JDBC,开发者可以在 Java 中使用 SQL 语法查询 MongoDB 数据库。这种方法对于熟悉 SQL 的团队非常有帮助,能够快速实现对 MongoDB 数据的操作。同时,也需要注意到这种方法的性能和功能限制,根据具体应用场景进行选择和优化。
639 9
|
SQL NoSQL Java
Java使用sql查询mongodb
通过MongoDB Atlas Data Lake或Apache Drill,可以在Java中使用SQL语法查询MongoDB数据。这两种方法都需要适当的配置和依赖库的支持。希望本文提供的示例和说明能够帮助开发者实现这一目标。
659 17

热门文章

最新文章