在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. 关于python类变量和实例变量

    今天在看python的类和实例的时候,突然发现了一个以前遗漏的点,也就是类变量和实例变量.首先需要理解一下类变量和实例变量的概念. 类全局变量:在类中定义,对类和由类生成的实例生效,如果通过方法对类变 ...

  2. redis主从复制配置(1)

    我们来配置一个一主两从的服务,根据前面写的已经配置好的redis基础上进行主从配置 一:进入redis的配置目录 cd /usr/local/redis 创建下面3个目录,命令为:make -p /u ...

  3. eclipse设置

    一.更改文件默认编码 一般每个项目及其项目中的文件的编码都要保持一致,主要是为了不让保存的内容出现乱码:一般会设置UTF-8这个编码格式 设置文件默认编码: windows-->General- ...

  4. CodeChef - BLACKCOM 可行性dp转最优化树dp

    https://www.codechef.com/problems/BLACKCOM 题意:一颗5000个黑白结点的树,10W个查询寻找是否存在大小s并且有t和黑节点的子图 一开始就觉得应当是一个树d ...

  5. 简洁架构的思想,基于go实现

    https://manuel.kiessling.net/2012/09/28/applying-the-clean-architecture-to-go-applications/ 从 Clean- ...

  6. Django REST Framework extensions

    GitHub:https://github.com/chibisov/drf-extensions 官方文档:http://chibisov.github.io/drf-extensions/docs ...

  7. servlet模拟SpringMVC

    1. web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=&q ...

  8. 2017-12-15python全栈9期第二天第七节之整除

    #!/user/bin/python# -*- coding:utf-8 -*-a = 10b = 20print(a // b)print(b // a)

  9. C#数据结构学习

    Collection类学习 using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  10. Immunity Debugger学习 二

    1.Exploit开发 发现漏洞只是一个开始,在你完成利用程序之前,还有很长一段路要走.不过Immunity专门为了这项任务做了许多专门设计,相信能帮你减少不少痛苦.接下来我们开发一些PyComman ...