在Java并发编程实践中4.4中提到向客户端加锁的方法。此为验证示例,写的不好,但可以看出结果来。

package com.blackbread.test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class GoodListHelper<E> {
public List<E> list = Collections.synchronizedList(new ArrayList<E>()); public boolean putIfAbsent(E x) throws InterruptedException {
synchronized (list) {
boolean absent = !list.contains(x);
if (absent) {
if (list.contains(x))
System.out.println(list.contains(x));
list.add(x);
}
return absent;
}
} public class PrintA extends Thread {
private GoodListHelper<String> goodListHelper;
private String value; public PrintA(GoodListHelper<String> goodListHelper, String value) {
this.goodListHelper = goodListHelper;
this.value = value;
} @Override
public void run() {
try {
goodListHelper.putIfAbsent(value);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public class PrintB extends Thread {
private GoodListHelper<String> goodListHelper;
private String value; public PrintB(GoodListHelper<String> goodListHelper, String value) {
this.goodListHelper = goodListHelper;
this.value = value;
} @Override
public void run() {
goodListHelper.list.add(value);
}
} public static void main(String[] args) throws InterruptedException {
final GoodListHelper<String> goodListHelper = new GoodListHelper<String>();
new Thread(new Runnable() {
@Override
public void run() {
ExecutorService executor = Executors.newFixedThreadPool(50);
for (int i = 0; i < 1000; i++) {
Thread t = goodListHelper.new PrintA(goodListHelper,
String.valueOf(i));
executor.execute(t);
}
executor.shutdown();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
ExecutorService executor = Executors.newFixedThreadPool(50);
for (int i = 0; i < 1000; i++) {
Thread t = goodListHelper.new PrintB(goodListHelper,
String.valueOf(i));
executor.execute(t);
}
executor.shutdown();
}
}).start();
}
}

读Java并发编程实践中,向已有线程安全类添加功能--客户端加锁实现示例的更多相关文章

  1. Java并发编程实践

    最近阅读了<Java并发编程实践>这本书,总结了一下几个相关的知识点. 线程安全 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任 ...

  2. [Java 并发] Java并发编程实践 思维导图 - 第一章 简单介绍

    阅读<Java并发编程实践>一书后整理的思维导图.

  3. [Java 并发] Java并发编程实践 思维导图 - 第二章 线程安全性

    依据<Java并发编程实践>一书整理的思维导图.

  4. [Java 并发] Java并发编程实践 思维导图 - 第四章 对象的组合

    依据<Java并发编程实践>一书整理的思维导图. 第一部分: 第二部分:

  5. java并发编程实践笔记

    文章转自:http://kenwublog.com/java-concurrency-in-practise-note 1, 保证线程安全的三种方法 :a, 不要跨线程访问共享变量b, 使共享变量是 ...

  6. 笔记:java并发编程实践1

    Java 5.0 adds ConcurrentHashMap, a replacement for synchronized hash-based Map implementations, and ...

  7. Java并发编程(多线程)中的相关概念

    众所周知,在Java的知识体系中,并发编程是非常重要的一环,也是面试中必问的题,一个好的Java程序员是必须对并发编程这块有所了解的. 并发必须知道的概念 在深入学习并发编程之前,我们需要了解几个基本 ...

  8. Java 并发编程实践基础 读书笔记: 第三章 使用 JDK 并发包构建程序

    一,JDK并发包实际上就是指java.util.concurrent包里面的那些类和接口等 主要分为以下几类: 1,原子量:2,并发集合:3,同步器:4,可重入锁:5,线程池 二,原子量 原子变量主要 ...

  9. Java并发编程实践读书笔记(2)多线程基础组件

    同步容器 同步容器是指那些对所有的操作都进行加锁(synchronize)的容器.比如Vector.HashTable和Collections.synchronizedXXX返回系列对象: 可以看到, ...

随机推荐

  1. SVN YUM安装

    一,安装: yum install subversion 二,创建配置SVN仓库: 目录自定,我这是在/home下: #cd /home # mkdir svn #svnadmin create /h ...

  2. lucene的CRUD操作Document(四)

    IndexWriter writer = new IndexWriter(Directory, IndexWriterConfig); 增加文档:writer.addDocument(); 读取文档: ...

  3. Vue.js 条件与循环

    条件判断: v-if: 条件判断使用 v-if 指令: v-else-if:(其实和Java,c,js的语法差不多) v-show:

  4. python类继承的重写和super

    给已经存在的类添加新的行为,继承是非常好的实现方式.但是如果要改变行为呢?比如在Python继承扩展内置类,我们的contact类只允许一个名字和一个邮箱,但是如果要对某些人增加电话号码呢?这里可以通 ...

  5. wz

    chcp 437 monkeyrunner wz.py wz.bat #coding=utf-8 from com.android.monkeyrunner import MonkeyDevice,M ...

  6. vmware centos7 网络配置

    1. 在vmware创建centos虚拟机 2. 在cmd下看一下本机所处的网段,并对一下vmware上的配置 如果同样处于同一网段(192.168.aaa.bbb,aaa处一致就行),就可以直接开机 ...

  7. MySQL数据库优化_limit_2

    limit豫union一起使用时的优化 cp_order_exit数据行数:142951 cp_order_exit_led数据行数:20876 查询:这条 查询将会把 cp_order_exit中的 ...

  8. collections 数据结构模块namedtuple

    namedtuple类 导入模块 from collections import namedtuple 使用方法及说明 #pycharm 里按住 ctrl键点击 collections可查看源码 #c ...

  9. Rancher之Pipeline JAVA demo

    Rancher Pipeline Pipeline,简单来说,就是一套运行于Rancher上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程. Ranc ...

  10. Python 排序和numpy排序,得到排序后索引序列(及源list的序列)

    Python list 排序 & np list 排序 nums = [1.25, 0.98, 6.13, 7.62] li = np.array(nums) print(li) out = ...