读Java并发编程实践中,向已有线程安全类添加功能--客户端加锁实现示例
在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并发编程实践中,向已有线程安全类添加功能--客户端加锁实现示例的更多相关文章
- Java并发编程实践
最近阅读了<Java并发编程实践>这本书,总结了一下几个相关的知识点. 线程安全 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任 ...
- [Java 并发] Java并发编程实践 思维导图 - 第一章 简单介绍
阅读<Java并发编程实践>一书后整理的思维导图.
- [Java 并发] Java并发编程实践 思维导图 - 第二章 线程安全性
依据<Java并发编程实践>一书整理的思维导图.
- [Java 并发] Java并发编程实践 思维导图 - 第四章 对象的组合
依据<Java并发编程实践>一书整理的思维导图. 第一部分: 第二部分:
- java并发编程实践笔记
文章转自:http://kenwublog.com/java-concurrency-in-practise-note 1, 保证线程安全的三种方法 :a, 不要跨线程访问共享变量b, 使共享变量是 ...
- 笔记:java并发编程实践1
Java 5.0 adds ConcurrentHashMap, a replacement for synchronized hash-based Map implementations, and ...
- Java并发编程(多线程)中的相关概念
众所周知,在Java的知识体系中,并发编程是非常重要的一环,也是面试中必问的题,一个好的Java程序员是必须对并发编程这块有所了解的. 并发必须知道的概念 在深入学习并发编程之前,我们需要了解几个基本 ...
- Java 并发编程实践基础 读书笔记: 第三章 使用 JDK 并发包构建程序
一,JDK并发包实际上就是指java.util.concurrent包里面的那些类和接口等 主要分为以下几类: 1,原子量:2,并发集合:3,同步器:4,可重入锁:5,线程池 二,原子量 原子变量主要 ...
- Java并发编程实践读书笔记(2)多线程基础组件
同步容器 同步容器是指那些对所有的操作都进行加锁(synchronize)的容器.比如Vector.HashTable和Collections.synchronizedXXX返回系列对象: 可以看到, ...
随机推荐
- curl与wget
curl 和wget 区别 使用方法 可参考 curl vs Wget 1.curl是libcurl这个库支持的,wget是一个纯粹的命令行命令.2.curl支持更多的协议.curl supports ...
- Linux系统上安装nodejs
1 官网下载地址:https://nodejs.org/en/download/ 2 下载的node-v10.15.2-linux-x64.tar.xz 上传到Linux系统后 因为安装的是纯净版 ...
- pt-online-schema-change 测试使用-包含生成测试数据
pt-online-schema-change 测试使用-包含生成测试数据 # 参考网址: https://www.2cto.com/database/201703/618280.html 一.简要描 ...
- nGrinder windows agent / linux agent
s ngrinder部署 https://blog.csdn.net/yue530tomtom/article/details/82113558 Windows机器启动不了ngrinder-agent ...
- idea使用maven打包项目
第一步:打开maven Projects 第二步.找到package 第三步,运行.到路径下面去找打包的文件吧. 第二种方法: 使用命令 cmd进入项目目录,例如项目在D盘项目名poject 输入: ...
- Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more jquery-1.12.4.js:10208
ajax执行请求之后返回了数据但是不执行success()函数,原因是返回得数据类型不是ajax请求中设定的:dataType:"json",因为是一个Map<Object, ...
- JMeter之Ramp-up Period(in seconds)说明(可同时并发)
Ramp-up Period(in seconds) [1]决定多长时间启动所有线程.如果使用10个线程,ramp-up period是100秒,那么JMeter用100秒使所有10个线程启动并运行. ...
- 【1】【leetcode-93】复原IP地址
(不会,典型) 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 示例: 输入: "25525511135" 输出: ["255.255.11.135 ...
- java代码实现ftp服务器的文件上传和下载
java代码实现文件上传到ftp服务器: 1:ftp服务器安装: 2:ftp服务器的配置: 启动成功: 2:客户端:代码实现文件的上传与下载: 1:依赖jar包: 2:sftpTools 工具类: ...
- linux_添加图标
sudo gedit /usr/share/applications/Pycharm.desktop [Desktop Entry] Type=Application Name=Pycharm Gen ...