java synchronized 对指定代码添加锁-简单样例

本文介绍了Java中两种实现线程锁的方法:一种是对静态代码添加锁,通过定义一个私有的静态对象作为同步锁;另一种是对实例代码添加锁,使用当前对象(this)作为锁的对象。这两种方法都能确保在多线程环境下代码块的执行是线程安全的。

1:对静态代码添加锁

private final static Object syncLock = new Object(); // 相当于线程锁,用于线程安全

 public static int n=0;
     public static void main(String[] args) {
         synchronized (syncLock){//锁
                 for(int i=0;i<100;i++) {

                         n++;

                          System.out.println(n);

                }
         }
    }

2: 对实例代码添加锁

public void test() {
         synchronized (this){//锁

                 for(int i=0;i<100;i++) {

                        System.out.println(i);

                }
             
         }
    }

<think>我们要介绍Java中的synchronized关键字,它用于控制多线程对共享资源的访问,确保同一时刻只有一个线程可以执行某个方法或代码块,从而避免线程冲突和数据不一致。 主要使用方式: 1. 同步实方法:锁是当前实对象。 2. 同步静态方法:锁是当前类的Class对象。 3. 同步代码块:可以指定锁对象,可以是实对象或Class对象。 下面写一段代码,展示使用synchronized同步实方法和同步代码块。 注意:代码要简洁明了,展示基本用法。</think>### Java `synchronized` 关键字介绍 `java synchronized` 是 Java 中实现线程同步的核心机制,通过**内置锁(Monitor)** 确保多线程环境下对共享资源的互斥访问。主要作用: 1. **原子性**:防止线程干扰(如竞态条件)。 2. **可见性**:保证线程修改后的状态对其他线程立即可见。 3. **有序性**:禁止指令重排序优化。 #### 使用方式: | **类型** | **锁对象** | **示** | |------------------|---------------------|-----------------------------------| | 同步实方法 | 当前实 (`this`) | `public synchronized void func()` | | 同步静态方法 | 类的 `Class` 对象 | `public static synchronized void func()` | | 同步代码块 | 指定任意对象 | `synchronized(obj) { ... }` | #### 代码:银行账户转账 ```java public class BankAccount { private double balance; // 共享资源 // 同步方法:确保存款操作线程安全 public synchronized void deposit(double amount) { balance += amount; System.out.println("存款: +" + amount + " | 余额: " + balance); } // 同步代码块:指定锁对象为当前实 public void withdraw(double amount) { synchronized (this) { // 锁对象为当前账户实 if (balance >= amount) { balance -= amount; System.out.println("取款: -" + amount + " | 余额: " + balance); } } } public static void main(String[] args) { BankAccount account = new BankAccount(); // 多线程并发测试 new Thread(() -> account.deposit(100)).start(); new Thread(() -> account.withdraw(50)).start(); } } ``` #### 输出示(线程安全): ``` 存款: +100.0 | 余额: 100.0 取款: -50.0 | 余额: 50.0 ``` --- ### 优缺点对比 | **维度** | **优点** | **缺点** | |----------------|-----------------------------------|-----------------------------------| | **实现复杂度** | 语法简单,自动加锁/解锁 | 灵活性低(无法非阻塞获取锁) | | **性能** | 适用于低竞争场景 | 高竞争时可能引发线程阻塞/死锁 | | **功能** | 内置 JVM 支持,无需额外依赖 | 不支持超时、公平锁等高级特性 | #### 适用场景: - ✅ **临界区保护**:简单共享资源(如计数器、状态标志)。 - ✅ **遗留系统维护**:兼容旧版 Java(早于 `java.util.concurrent` 包)。 - ❌ **高并发场景**:优先选择 `ReentrantLock`(支持条件变量、可中断)。 - ❌ **分布式系统**:需改用分布式锁(如 Redis/ZooKeeper)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时间 流逝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值