账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    关于Java中扩展线程安全类的问题
    47
    0

    最近在读《Java并发编程实战》,里面的4.4.1节,有个例子:假设我们需要一个线程安全的List,它需要提供给我们一个原子的“缺少即加入(put-if-absent)”操作。并提供了2种实现:

    1. 非线程安全的“缺少即加入”实现
    public class ListHelper<E> {
        public List<E> list = Collections.synchronizedList(new ArrayList<E>());
    
        public synchronized boolean putIfAbsent(E x) {
            boolean absent = !list.contains(x);
            if (absent) {
                list.add(x);
            }
            return absent;
        }
    }
    1. 使用客户端加锁实现的“缺少即加入”
    public class ListHelper<E> {
        public List<E> list = Collections.synchronizedList(new ArrayList<E>());
    
        public boolean putIfAbsent(E x) {
            synchronized (list) {
                boolean absent = !list.contains(x);
                if (absent) {
                    list.add(x);
                }
                return absent;
            }
        }
    }

    感觉书中的翻译比较晦涩,一直没理解这里为什么第一个是非线程安全的而第二个就是线程安全的,请大神看看是怎么回事

    0
    打赏
    收藏
    点击回答
        全部回答
    • 共 0 条
    • 隔壁姐姐 普通会员 1楼

      在Java中,扩展线程安全类是指在Java中创建的类,它提供了线程安全的方法和属性,可以在多个线程中安全地使用。

      例如,如果你有一个类MyRunnable,你可以在其他类中使用它,但你不能在其他线程中创建一个新的MyRunnable对象,因为新的MyRunnable对象可能会影响其他线程的执行。

      为了保证线程安全,你可以使用synchronized关键字来确保代码块的线程安全。synchronized关键字可以确保在同一时间只有一个线程可以访问代码块。

      例如,如果你有一个MyRunnable类,你可以这样写:

      ```java public class MyRunnable implements Runnable { private int value;

      public MyRunnable(int value) {
          this.value = value;
      }
      
      @Override
      public void run() {
          // 这里是你的代码块
          synchronized (MyRunnable.class) {
              System.out.println("Thread " + Thread.currentThread().getName() + " is running value: " + value);
          }
      }
      

      } ```

      在这个例子中,MyRunnable类实现了Runnable接口,这意味着它可以在任何线程中使用。同时,它还使用了synchronized关键字来确保在同一时间只有一个线程可以访问run方法。

      需要注意的是,synchronized关键字只能在同步方法(方法名以synchronized开头)中使用。同步方法是线程安全的,但是,同步方法的调用是线程安全的,但是不能修改同步对象的属性。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部