java中static方法加锁

本文通过一个具体的Java示例,深入探讨了synchronized关键字在静态方法中的使用方式及其锁的实现原理。文章解释了如何利用synchronized关键字实现线程间的同步,并证明了静态方法的锁是由Class对象提供的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class Sync {

    public static void main(String[] args) throws InterruptedException {

        Executors.newCachedThreadPool().submit(new Static(Loker.class));

        Thread.sleep(1000);

        Loker.call();

    }

}

class Loker{

    public static synchronized void call(){

        System.out.println("call in");

    }

}

class Static implements Callable{

    private Object locker;

    public Static(Object loker){

        this.locker=loker;

    }

    @Override

    public Object call() throws Exception {

        synchronized (locker){

            Thread.sleep(4000);

            System.out.println("sleep end");

        }

        return null;

    }

}

可以看到结果每次都要sleep end才能call in

也就是说静态方法加锁是通过Class对象来加锁的

这样也证明了一个类只有一个Class对象,(因为synchronized是通过==来比较的)

转载于:https://my.oschina.net/u/1442901/blog/298538

Java中使用Redis实现分布式锁的一般步骤如下: 1. 首先,连接Redis服务器,获取JedisClient对象。 2. 使用setnx操作,尝试获取锁。setnx是Redis的一个原子操作,如果key存在则返回0,否则返回1。我们可以把key设置为锁的名称,value设置为当前时间加上一个超时时间(避免出现死锁),并设置过期时间。 3. 如果setnx返回1,说明获取锁成功,可以执行业务逻辑。如果返回0,说明锁已经被其他线程持有,需要等待一段时间再次尝试获取锁。 4. 执行完业务逻辑后,使用del操作释放锁。在释放锁之前,需要先判断锁是否已经过期,如果锁已经过期,则不能再释放锁,因为此时有可能锁已经被其他线程持有。 下面是一个简单的Redis分布式锁的示例代码: ```java public class RedisLock { private static final String LOCK_PREFIX = "lock:"; private static final int LOCK_EXPIRE_TIME = 300; // 锁的过期时间,单位为秒 private Jedis jedis; private String lockName; public RedisLock(Jedis jedis, String lockName) { this.jedis = jedis; this.lockName = LOCK_PREFIX + lockName; } public boolean tryLock() { String value = System.currentTimeMillis() + LOCK_EXPIRE_TIME + ""; long result = jedis.setnx(lockName, value); if (result == 1) { jedis.expire(lockName, LOCK_EXPIRE_TIME); return true; } return false; } public void unlock() { String value = jedis.get(lockName); if (value != null && System.currentTimeMillis() < Long.parseLong(value)) { jedis.del(lockName); } } } ``` 使用示例: ```java Jedis jedis = new Jedis("localhost", 6379); RedisLock lock = new RedisLock(jedis, "mylock"); if (lock.tryLock()) { try { // 执行业务逻辑 } finally { lock.unlock(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值