读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返回系列对象: 可以看到, ...
随机推荐
- 我的winows server 2012 突然多了个piress的帐户,后来一查原来是mysql漏洞的问题,郁闷
今天打开远程连接到windows server 2012,服务器上装的360竟然提示有木马.吓了一跳.再检查计算机账户,多了个piress账户.把这个账户在百度一搜索,原来还有其它人中招. 后来发现网 ...
- C++学习之回调函数
回调函数: 通过函数指针进行调用的函数. 回调函数不是由实现方进行调用,而是将函数指针传入,在特殊条件或者状态下进行触发调用. 譬如: 在自定义按钮控件时,当点击按钮,触发点击事件,调用指定函数. 注 ...
- flask flash消息
请求完成,让用户知道状态发生了变化,可以使用flash确认消息 示例: xx.py from flask import Flask,render_template,request,redirect,u ...
- OS + RedHat 6.3 x64 NFS / mount.nfs: access denied by server while mounting
s Linux mount/unmount命令(转) https://www.cnblogs.com/xd502djj/p/3809375.html 问题2:NFS配置项no_root_squash和 ...
- thinkpad yoga 12 / thinkpad s1 yoga / WS860
s 序号 IP地址 MAC地址 主机名 设备商 1 192.168.3.6 34-02-86-29-46-8B Intel(R) Dual Band Wireless-AC 7265 Intel公司/ ...
- Xshell安装及漏洞详解
1.下载安装包 ... 2.双击安装包,进入安装第一步 3.输入客户信息 4.选择目的位置,可以通过浏览器进行修改安装路径,点击下一步按钮 5.选择程序文件夹,点击下一步按钮 6.等待安装 7.完成安 ...
- Windows server 2008 R2远程桌面3389端口号修改
修改 Windows 服务器默认远程端口 https://help.aliyun.com/document_detail/51644.html?spm=5176.doc51644.6.784.4iAH ...
- springcloud学习笔记
一.什么是springcloud,有什么作用 Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消 ...
- 面向对象【林老师版】:__init__定制自己独有的特征(三)
本节内容 1.是如何产生对象 2.实例化的步骤 3.类即类型 一.是如何产生对象? __init__方法用来为对象定制对象自己独有的特征 1.stu1=LuffyStudent()调用报错 1.代码 ...
- netty的对象传输
pom <!-- https://mvnrepository.com/artifact/io.netty/netty-all --> <dependency> <grou ...