1,保证线程安全的三种方法:

a,不要跨线程访问共享变量

b,使共享变量是final类型的

c,将共享变量的操作加上同步

2,一开始就将类设计成线程安全的, 比在后期重新修复它,更容易.

3, 编写多线程程序, 首先保证它是正确的, 其次再考虑性能.

4,无状态或只读对象永远是线程安全的.

5, 不要将一个共享变量裸露在多线程环境下(无同步或不可变性保护)

6, 多线程环境下的延迟加载需要同步的保护, 因为延迟加载会造成对象重复实例化

7,对于volatile声明的数值类型变量进行运算,往往是不安全的(volatile只能保证可见性,不能保证原子性).详见volatile原理与技巧中,脏数据问题讨论.8,当一个线程请求获得它自己占有的锁时(同一把锁的嵌套使用),我们称该锁为可重入锁.在jdk1.5并发包中,提供了可重入锁的java实现-ReentrantLock.9,每个共享变量,都应该由一个唯一确定的锁保护.创建与变量相同数目的ReentrantLock,使他们负责每个变量的线程安全.

10,虽然缩小同步块的范围,可以提升系统性能.

但在保证原子性的情况下, 不可将原子操作分解成多个synchronized块.

11, 在没有同步的情况下, 编译器与处理器运行时的指令执行顺序可能完全出乎意料.

原因是, 编译器或处理器为了优化自身执行效率, 而对指令进行了的重排序(reordering).

12, 当一个线程在没有同步的情况下读取变量, 它可能会得到一个过期值, 但是至少它可以看到那个

线程在当时设定的一个真实数值. 而不是凭空而来的值. 这种安全保证, 称之为最低限的安全性(out-of-thin-air safety)

在开发并发应用程序时, 有时为了大幅度提高系统的吞吐量与性能, 会采用这种无保障的做法.

但是针对, 数值的运算, 仍旧是被否决的.

13,volatile变量,只能保证可见性,无法保证原子性.详见 14,某些耗时较长的网络操作或IO,确保执行时,不要占有锁.15,发布(publish)对象,指的是使它能够被当前范围之外的代码所使用.(引用传递)对象逸出(escape),指的是一个对象在尚未准备好时将它发布.原则:为防止逸出,对象必须要被完全构造完后,才可以被发布(最好的解决方式是采用同步)

this关键字引用对象逸出例子:在构造函数中,开启线程,并将自身对象this传入线程,造成引用传递.而此时,构造函数尚未执行完,就会发生对象逸出了.16,必要时,使用ThreadLocal变量确保线程封闭性(封闭线程往往是比较安全的,但一定程度上会造成性能损耗)封闭对象的例子在实际使用过程中,比较常见,例如hibernate openSessionInView机制, jdbc的connection机制.

17,单一不可变对象往往是线程安全的(复杂不可变对象需要保证其内部成员变量也是不可变的)良好的多线程编程习惯是:将所有的域都声明为final,除非它们是可变的18,保证共享变量的发布是安全的a,通过静态初始化器初始化对象(jls 12.4.2叙述, jvm会保证静态初始化变量是同步的)

b,将对象申明为volatile或使用AtomicReference

c,保证对象是不可变的d,将引用或可变操作都由锁来保护19,设计线程安全的类,应该包括的基本要素:

a,确定哪些是可变共享变量b,确定哪些是不可变的变量c,指定一个管理并发访问对象状态的策略20,将数据封装在对象内部,并保证对数据的访问是原子的.建议采用volatile javabean模型或者构造同步的getter,setter.21,线程限制性使构造线程安全的类变得更容易,因为类的状态被限制后,分析它的线程安全性时,就不必检查完整的程序.22,编写并发程序,需要更全的注释,更完整的文档说明.23,在需要细分锁的分配时,使用java监视器模式好于使用自身对象的监视器锁.前者的灵活性更好.

Object target = new Object();

//这里使用外部对象来作为监视器,而非this

synchronized(target) {

// TODO

}针对javamonitor pattern,实际上ReentrantLock的实现更易于并发编程.功能上,也更强大.24,设计并发程序时,在保证伸缩性与性能折中的前提下,优先考虑将共享变量委托给线程安全的类.由它来控制全局的并发访问.25,使用普通同步容器(Vector, Hashtable)的迭代器,需要外部锁来保证其原子性.原因是,普通同步容器产生的迭代器是非线程安全的.26,在并发编程中,需要容器支持的时候,优先考虑使用jdk并发容器(ConcurrentHashMap, ConcurrentLinkedQueue, CopyOnWriteArrayList...).27, ConcurrentHashMap, CopyOnWriteArrayList并发容器的迭代器,以及全范围的size(), isEmpty()都表现出弱一致性.他们只能标示容器当时的一个数据状态.无法完整响应容器之后的变化和修改.

28,使用有界队列,在队列充满或为空时,阻塞所有的读与写操作. (实现生产-消费的良好方案)BlockQueue下的实现有LinkedBlockingQueue与ArrayBlockingQueue,前者为链表,可变操作频繁优先考虑,后者为数组,读取操作频繁优先考虑.

PriorityBlockingQueue是一个按优先级顺序排列的阻塞队列,它可以对所有置入的元素进行排序(实现Comparator接口)

29,当一个方法,能抛出InterruptedException,则意味着,这个方法是一个可阻塞的方法,如果它被中断,将提前结束阻塞状态.当你调用一个阻塞方法,也就意味着,本身也称为了一个阻塞方法,因为你必须等待阻塞方法返回.如果阻塞方法抛出了中断异常,我们需要做的是,将其往上层抛,除非当前已经是需要捕获异常的层次.如果当前方法,不能抛出InterruptedException,可以使用Thread.currentThread.interrupt()方法,手动进行中断.===================================================

Webservices :找到项目工程中*.wsdl文件--》Webservices》Test with webservices exploer

java webservice 线程_编程实践笔记{Java 线程 并发处理 Webservice}相关推荐

  1. JAVA并发编程实践笔记

    2019独角兽企业重金招聘Python工程师标准>>> JAVA并发编程实践笔记 博客分类: java JAVA并发编程实践笔记 1, 保证线程安全的三种方法:     a, 不要跨 ...

  2. reentrantlock非公平锁不会随机挂起线程?_【原创】Java并发编程系列16 | 公平锁与非公平锁...

    本文为何适原创并发编程系列第 16 篇,文末有本系列文章汇总. 上一篇提到重入锁 ReentrantLock 支持两种锁,公平锁与非公平锁.那么这篇文章就来介绍一下公平锁与非公平锁. 为什么需要公平锁 ...

  3. 基于《狂神说Java》JUC并发编程--学习笔记

    前言: 本笔记仅做学习与复习使用,不存在刻意抄袭. -------------------------------------------------------------------------- ...

  4. java 判断类型_如何快速入门Java编程学习(干货)

    一.初识Java 1.生活中的程序: 从起床到教室上课的过程 穿衣打扮>起床>洗漱>出宿舍>>吃早餐>到教室 按照特定的顺序去完成某一件事的过程我们叫做生活中的程序 ...

  5. java线程的创建线程_多线程(Thread、线程创建、线程池)

    第1章 多线程 1.1 多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序, ...

  6. java新手的通病_编程随想:Java新手的通病 PDF 下载

    编程随想:Java新手的通病 PDF 下载 下载地址: 提取码:onyi 相关截图: 主要内容: 其实很早以前就想写这样一个文章,可惜当时我没有 Blog,所以到现在才写下来.最近几年,随着 Java ...

  7. java 面试 概率论_编程培训-115个Java面试题和答案B.pdf

    编程培训-115个Java面试题和答案B.pdf "玩转"Java系列 1 题目115个Java面试题和答案终极(下) 第一篇讨论了面向对象编程和它的特点,关于Java和它的功能的 ...

  8. java如何关闭一个线程_如何关闭一个java线程池

    Java 并发工具包中 java.util.concurrent.ExecutorService 接口定义了线程池任务提交.获取线程池状态.线程池停止的方法等. JDK 1.8 中,线程池的停止一般使 ...

  9. delphi java jni 互通_编程应用实例:Java通过JNI与Delphi交互

    来源: 赛迪网 作者: 若水 2008-05-14/18:11 前一段时间,我用java开发一个安装程序,适用于tomcat mysql构建的web环境.在开发的过程中遇到与写注册表,注册系统服务等问 ...

最新文章

  1. 15张图来了解【树】,面试再也不怕被刷了
  2. 「谷歌大脑」提出通过对长序列进行摘要提取,AI可自动生成「维基百科」
  3. 山东外贸职业学院王彩霞老师网上考试系统及c语言考试题库》,2019年山东外贸职业学院单独招生考试 《语文》考试大纲(夏季高考)...
  4. 快手裁员30%,大部分年薪超100w?工资越高越容易被裁,你慌了吗?
  5. nginx+awstats多域名日志分析2
  6. XMPP键盘订制实现图文混排
  7. c语言地图导航代码大全,C语言实训—电子地图导航系统源代码.docx
  8. 使用MATLAB快速完成对ADC信号质量的分析
  9. 五行代码终极完美解决从IE6到Chrome所有浏览器的position:fixed;以及闪动问题
  10. Work Time Manager【开源项目】- 创建自己日志组件 2.0重构
  11. sharepoint 概念及认证方式介绍
  12. Git-简单安装与使用
  13. PAT-乙级-1039. 到底买不买(20)
  14. android selector(转)
  15. jquery validate的验证规则和验证提示
  16. 独家|对决金融云:备案将至,谁得先手
  17. 超强电脑工具箱!100个神器一款软件全搞定!效率必备!
  18. 考研英语九附双语阅读:英国品牌美国遇冷 美国人不待见英国货?
  19. 【OpenVP* 】Centos 部署OpenVP* 证书+多客户端+密码认证
  20. ElasticSearch第一讲:ElasticSearch从入门到精通

热门文章

  1. 匈牙利命名法、骆驼命名法、帕斯卡(pascal)命名法 C#命名规范
  2. 树的非递归(前序,中序,后序)
  3. 把html转换成PDF的手机软件,如何将MHTML转换为PDF(Convert MHTML to PDF)?
  4. mysql单机在线迁移_MySQL 不停服务 在线进行100亿数据迁移切换
  5. filter过滤器_Java过滤器Filter讲解(Java基础)
  6. oracle awr报告生成_oracle11g awr报告分析—WORKLOAD REPOSITORY report
  7. linux上apache目录在哪,Linux下Apache目录明细
  8. php调用trait方法,PHP Laravel中的Trait使用方法
  9. php注册变量函数,PHP变量函数
  10. JAVA中几种循环结构的表示_本文通过实例讲解给大家介绍Java中for、while、do while三种循环语句的区别,具体详情如下所示:第一种:for循环 循环结构for语句的格式...