Java中对String加锁

String类型的值通常存储于常量池或JVM堆中。

字符串变量赋值时,赋值符右边:

    1、只有字符串常量,那么变量存放在常量池里面。

    2、new出来的字符串是存放在 堆里面。

    3、对字符串进行拼接(+)操作时,分两种情况:

         A、表达式右边是纯字符串常量,那么存放在常量池里面。

         B、表达式右边如果存在字符串引用,那么就存放在JVM堆里面。

String a = "aaa";  // 常量池
String b = "bbb";  // 常量池
String c = a + b;  // JVM堆
String d = "aaa" + "bbb";  // 常量池
String e = "aaabbb";  // 常量池

System.out.println(c == d); // false
System.out.println(d == e);// true
System.out.println(c.intern() == d); // true

通过上面理解,当对String加锁的时候,需要保证当前加锁的String是唯一的。

如果要对String加锁,最好是加锁String.intern()方法。

String.intern():判断该字符串是否存在常量池中,如果存在直接获取,不存在将当前字符串放到常量池中。

public class StringSync {
    public static void main(String[] args) {
        String param = "type";
        String num = "1";
        String token = param + num;
        synchronized (token.intern()) {
            // 执行同步方法
        }
    }
}

 

转载于:https://my.oschina.net/izu/blog/3050368

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值