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

  1. package com.blackbread.test;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Collections;
  5. import java.util.List;
  6. import java.util.concurrent.ExecutorService;
  7. import java.util.concurrent.Executors;
  8.  
  9. public class GoodListHelper<E> {
  10. public List<E> list = Collections.synchronizedList(new ArrayList<E>());
  11.  
  12. public boolean putIfAbsent(E x) throws InterruptedException {
  13. synchronized (list) {
  14. boolean absent = !list.contains(x);
  15. if (absent) {
  16. if (list.contains(x))
  17. System.out.println(list.contains(x));
  18. list.add(x);
  19. }
  20. return absent;
  21. }
  22. }
  23.  
  24. public class PrintA extends Thread {
  25. private GoodListHelper<String> goodListHelper;
  26. private String value;
  27.  
  28. public PrintA(GoodListHelper<String> goodListHelper, String value) {
  29. this.goodListHelper = goodListHelper;
  30. this.value = value;
  31. }
  32.  
  33. @Override
  34. public void run() {
  35. try {
  36. goodListHelper.putIfAbsent(value);
  37. } catch (InterruptedException e) {
  38. e.printStackTrace();
  39. }
  40. }
  41. }
  42.  
  43. public class PrintB extends Thread {
  44. private GoodListHelper<String> goodListHelper;
  45. private String value;
  46.  
  47. public PrintB(GoodListHelper<String> goodListHelper, String value) {
  48. this.goodListHelper = goodListHelper;
  49. this.value = value;
  50. }
  51.  
  52. @Override
  53. public void run() {
  54. goodListHelper.list.add(value);
  55. }
  56. }
  57.  
  58. public static void main(String[] args) throws InterruptedException {
  59. final GoodListHelper<String> goodListHelper = new GoodListHelper<String>();
  60. new Thread(new Runnable() {
  61. @Override
  62. public void run() {
  63. ExecutorService executor = Executors.newFixedThreadPool(50);
  64. for (int i = 0; i < 1000; i++) {
  65. Thread t = goodListHelper.new PrintA(goodListHelper,
  66. String.valueOf(i));
  67. executor.execute(t);
  68. }
  69. executor.shutdown();
  70. }
  71. }).start();
  72. new Thread(new Runnable() {
  73. @Override
  74. public void run() {
  75. ExecutorService executor = Executors.newFixedThreadPool(50);
  76. for (int i = 0; i < 1000; i++) {
  77. Thread t = goodListHelper.new PrintB(goodListHelper,
  78. String.valueOf(i));
  79. executor.execute(t);
  80. }
  81. executor.shutdown();
  82. }
  83. }).start();
  84. }
  85. }

读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. centos7 mysql-server 安装过程

    官网下载安装mysql-server # wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm # rpm -i ...

  2. (二叉树 BFS) leetcode513. Find Bottom Left Tree Value

    Given a binary tree, find the leftmost value in the last row of the tree. Example 1: Input: 2 / \ 1 ...

  3. [USACO07NOV] Milking Time

    题目链接 动态规划转化成 DAG 然后拓扑求解的思路 虽然很简单不过感觉这个新思路会很有用! 如果两个事件互不影响并且有先后关系,就可以连一条有向边,跑最长路可以得到最后的最优解 实际上这还是个背包… ...

  4. ajax传值修改数据

    主界面代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  5. SSM结构

    代码结构为 src:controller  / mapper / entity / service /(serviceiml) webcontent:META-INF  WEB-INF:lib(包含所 ...

  6. linux proc

    /proc文件系统下的多种文件提供的系统信息不是针对某个特定进程的,而是能够在整个系统范围的上下文中使用.可以使用的文件随系统配置的变化而变化. /proc/cmdline 这个文件给出了内核启动的命 ...

  7. 2017-12-14python全栈9期第一天第五节之变量、常量、注释

    6,变量. 变量:就是将一些运算的中间结果暂存到内存中,以便后续代码调用. 1,必须由数字,字母,下划线任意组合,且不能数字开头. 2,不能是python中的关键字. ['and', 'as', 'a ...

  8. 基于jieba,TfidfVectorizer,LogisticRegression进行搜狐新闻文本分类

    一.简介 此文是对利用jieba,word2vec,LR进行搜狐新闻文本分类的准确性的提升,数据集和分词过程一样,这里就不在叙述,读者可参考前面的处理过程 经过jieba分词,产生24000条分词结果 ...

  9. Hadoop HDFS常用操作命令

    hadoop常用命令:hadoop fs查看Hadoop HDFS支持的所有命令 hadoop fs –ls列出目录及文件信息 hadoop fs –lsr循环列出目录.子目录及文件信息 hadoop ...

  10. Spring+Mybatis+SpringMVC+Atomikos多数据源共存+不同数据库事物一致性处理

    网上找了一大堆的例子,没一个跑通的,都是copy转发,哎,整理得好辛苦..做个笔记,方便正遇到此问题的猿们能够得到帮助....废话不多说,贴代码..... 项目结构说明: 1.dao层的admin.w ...