- 浏览: 48476 次
- 性别:
- 来自: 深圳
最新评论
-
sunspring:
我正不知道怎么配置呢
试试先
我也是习惯了eclipse,又是 ...
Eclipse C/C++配置 -
badboy_blue:
cenziboy 写道为什么要用 Eclipse ? VC ...
Eclipse C/C++配置 -
cenziboy:
为什么要用 Eclipse ?
VC 2010 不行吗?
Eclipse C/C++配置
线程安全
调用某函数操作某对象,该对象暂时处于不可用状态,等到操作完成才能回到可用状态。
其他线程企图访问一个不可用状态的对象,该对象不能正确响应而产生无法预料的结果,线程安全的核心问题就是避免这种情况。
servlet的线程安全性
servlet/jsp默认是使用多线程模式执行的。
无状态的servlet、有状态的servlet(含有类实例变量)
解决线程不安全性:
1、取消servlet的类实例变量,编程无状态的servlet
2、对共享数据进行同步操作,使用synchronized关键字保证一次只有一个线程访问被保护的区段。
public class ConcurrentServlet extends HttpServlet { private static final long serialVersionUID = 1L; //这样定义成类实例变量就是有状态的servlet //int result=0; public ConcurrentServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String s1 = request.getParameter("num1"); String s2 = request.getParameter("num2"); int result=0; //这样定义就是无状态servlet if(s1!=null && s2!=null) { result = Integer.parseInt(s1) * Integer.parseInt(s2); } try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } PrintWriter out = response.getWriter(); out.println(result); out.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } public class Concurrent2Servlet extends HttpServlet { private static final long serialVersionUID = 1L; int result=0; public Concurrent2Servlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String s1 = request.getParameter("num1"); String s2 = request.getParameter("num2"); synchronized (this) { if(s1!=null && s2!=null) { result = Integer.parseInt(s1) * Integer.parseInt(s2); } try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } PrintWriter out = response.getWriter(); out.println(result); out.close(); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
同步和互斥
线程干扰
public class BankAccount { private int number; private int balance; public BankAccount(int number, int balance){ this.number = number; this.balance = balance; } public void deposit(int amount){ balance = balance + amount; } public void withdraw(int amount){ balance = balance - amount; } public int getBalance() { return balance; } static class Depositer implements Runnable{ BankAccount account; int amount; public Depositer(BankAccount account, int amount){ this.account = account; this.amount = amount; } @Override public void run() { for(int i=0; i<10000; i++){ account.deposit(amount); } } } static class Withdrawer implements Runnable{ BankAccount account; int amount; public Withdrawer(BankAccount account, int amount){ this.account = account; this.amount = amount; } @Override public void run() { for(int i=0; i<10000; i++){ account.withdraw(amount); } } } public static void main(String[] args) throws InterruptedException { BankAccount a = new BankAccount(1, 1000); Thread t1 = new Thread(new Depositer(a, 100), "depositer"); Thread t2 = new Thread(new Withdrawer(a, 100), "withdrawer"); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(a.getBalance()); } }
同步
当两个线程需要使用同一个对象时,存在交叉操作破坏数据独立性的可能,同步可以避免这种线程干扰。
java提供synchronized关键字来支持内在锁
1、同步方法中的锁
public synchronized void deposit(int amount){ balance = balance + amount; } public synchronized void withdraw(int amount){ balance = balance - amount; }
线程调用同步方法时自动获得这个方法所在对象的内在锁,发放返回时释放,发生未捕获的异常时也会释放。
2、同步语句
public void deposit(int amount){ synchronized(this){ balance = balance + amount; } } public void withdraw(int amount){ synchronized(this){ balance = balance - amount; } }
同步语句需要制定提供锁的对象
3、同步类
synchronized修饰类,该类的所有方法都是同步方法。
4、可重入同步
不太理解
同步与volatile
java提供了一种同步机制,不提供对锁的独占访问,同样可以确保对变量的每个读取操作都返回最近写入的值,这种机制就是只使用volatile变量。
活性
死锁、饿锁、活锁
死锁,多个线程竞争共享资源,每个线程都被阻塞,不能结束,进入永远等待状态。
死锁案例,哲学家用餐问题。
饿锁,共享资源被贪婪线程长期占用,其他线程不能获取共享资源,不能继续工作。
活锁,线程没有被锁定,只是忙于互相响应,以至不能恢复工作。
ThreadLocal变量
ThreadLocal是Thread的局部变量,ThreadLocal为每个使用该变量的线程提供独立的副本,
public class SequenceNumber { //匿名子类创建ThreadLocal变量 private static ThreadLocal<Integer> seq = new ThreadLocal<Integer>(){ public Integer initialValue() { //覆盖初始化方法 return 0; } }; public Integer getNextNumber(){ seq.set(seq.get()+1); return seq.get(); } private static class TestClient extends Thread { private SequenceNumber sn; public TestClient(SequenceNumber sn){ this.sn = sn; } public void run() { for(int i=0; i<3; i++) { System.out.println("Thread["+Thread.currentThread().getName() +"] sn["+sn.getNextNumber()+"]"); } } } public static void main(String[] args) { SequenceNumber sn = new SequenceNumber(); TestClient t1 = new TestClient(sn); TestClient t2 = new TestClient(sn); TestClient t3 = new TestClient(sn); t1.start(); t2.start(); t3.start(); } }
ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题,但是:
同步机制使用‘以时间换空间’的方式,提供一份变量,让不同的线程排队访问;
ThreadLocal使用‘以空间换时间’的方式,为每个线程提供一份变量,同时访问互不影响。
高级并发对象
java.lang.concurrent
Lock对象、执行器、并发集合、原子变量、同步器。
发表评论
-
java序列化揭秘
2011-12-14 10:06 779Thinking in java在java IO系统那一章讲到 ... -
big endian/little endian
2011-12-12 15:17 788Java和一些windows编程语言如c、c+ ... -
myEclipse插件
2011-11-09 14:35 1191拷贝插件到dropins路径下,重启myEclipse即可。 ... -
深入JVM-JVM
2011-08-03 18:44 837最近在看深入JAVA虚拟机这本书,JAVA虚拟机这章讲得很细致 ... -
java核心技术之反射
2011-07-26 13:11 1386能够分析类能力的程序成为反射。 使用反射的主要对象是工具 ... -
java并发编程1
2011-07-13 14:24 693进程和线程 进程和程序区别: 1、进程是程序的一次运行活动 ... -
string、byte、位运算碰到问题
2011-06-14 14:51 2434情景:java对byte[]做^实现加密,C对Char[]做^ ... -
jconsole远程监控Tomcat
2011-05-11 19:51 4417一、主要配置: 1、服务端tomcat启动时需要增加一 ... -
struts2异常
2011-04-14 19:47 1619由于使用WTP插件,tomcat部署跟myEclipse不太一 ... -
Spring事务
2011-03-30 10:37 711Spring事务配置的五种方式 http://www. ... -
IO字符流字节流
2010-12-30 17:38 890IO分两种流 字节流 InputStream OutputSt ... -
字节流分段读取
2010-08-12 15:28 1602遇到一个问题,字节流操作方面的,在windows环境下一定 ... -
JAVA面试题
2010-05-17 17:14 824JAVA相关基础知识1、面向对象的特征有哪些方面 1.抽象:抽 ... -
深入浅出hibernate笔记
2010-03-17 13:35 1356实体的3种状态:Transient自由 Persistent持 ... -
模板方法模式应用
2009-10-08 17:27 739GOF给模板方法(Template Method)模式定义一个 ... -
读取资源文件
2009-07-02 16:48 1106public class ConfigManage { ...
相关推荐
Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。《Java并发编程实践》(Addison.Wesley.Java.Concurrency.in.Practice.May.2006.chm)...
《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...
《Java并发编程实战》这本书是关于Java语言中并发编程技术的经典著作。它详细介绍了如何在Java环境中有效地实现多线程程序和并发控制机制。在Java平台上,由于其本身提供了强大的并发编程支持,因此,掌握并发编程...
《Java并发编程艺术》这本书深入探讨了Java平台上的并发编程技术。并发编程是现代多核处理器环境下提升软件性能的关键手段,而Java语言提供了丰富的工具和API来支持这一领域。本书旨在帮助开发者理解和掌握如何在...
《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南。这本书旨在帮助开发者理解和掌握在Java环境中创建高效、可扩展且可靠的多线程应用程序的关键技术和实践。它涵盖了从基本概念到高级主题的广泛内容,...
JAVA并发编程艺术 高清pdf : 1.并发变成的挑战 2. java并发机制的底层实现原理 3. java 内存模型 4. java并发编程基础 5.java中的锁。。。。。。。
JAVA并发编程实践中文版 英文版 原书源码 带书签 java_concurrency_in_practice.pdf 英文版还是不错的,但是中文版的译者典型的没有技术功底,介绍上说什么专家, 翻译的非常差劲,有些句子都不通顺,都不知道自己去...
Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。这份“java并发编程内部分享PPT”显然是一个深入探讨这一主题的资料,旨在帮助开发者...
### Java并发编程实战知识点概述 #### 一、Java并发特性详解 在《Java并发编程实战》这本书中,作者深入浅出地介绍了Java 5.0和Java 6中新增的并发特性。这些特性旨在帮助开发者更高效、安全地编写多线程程序。书中...
《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南,由Tim Peierls等人与Brian Goetz合著,旨在帮助Java开发者理解和掌握在多线程环境中编写高效、安全的代码。这本书由拥有丰富经验的JDK并发大师及...
《Java并发编程的艺术》这本书是Java开发者深入理解并发编程的重要参考书籍。这本书全面地介绍了Java平台上的并发和多线程编程技术,旨在帮助开发者解决在实际工作中遇到的并发问题,提高程序的性能和可伸缩性。 ...
2. **同步机制**:Java并发编程的核心在于同步,以防止数据不一致性和资源竞争。`synchronized`关键字用于实现临界区的互斥访问,确保同一时刻只有一个线程执行特定代码块。此外,还有`wait()`, `notify()`, `...
《Java并发编程实践》是一本深入探讨Java多线程编程的经典著作,由Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowles和David Holmes等专家共同编写。这本书全面介绍了Java平台上的并发编程技术,是Java开发...
《JAVA并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。它涵盖了Java并发的核心概念、工具和最佳实践,旨在帮助读者在多线程环境下编写高效、安全的代码。 并发编程是现代软件开发中的关键技能,...
《JAVA并发编程艺术》是Java开发者深入理解和掌握并发编程的一本重要著作,它涵盖了Java并发领域的核心概念和技术。这本书详细阐述了如何在多线程环境下有效地编写高效、可靠的代码,对于提升Java程序员的技能水平...
Java并发编程实践是Java开发中不可或缺的一个领域,它涉及到如何高效、正确地处理多线程环境中的任务。这本书的读书笔记涵盖了多个关键知识点,旨在帮助读者深入理解Java并发编程的核心概念。 1. **线程和进程的...
《Java并发编程从入门到精通》是一本专为Java开发者设计的深度学习并发编程的书籍。作者韩剑锋,凭借其12年的IT行业经验,曾担任多家IT公司的研发总监和技术总监,以其丰富的实战经验和深厚的理论知识,为读者提供了...