网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.Java开源项目Hibernate快速入门.
.提高J2EE层与数据库层交互操作能.
.详细介绍并掌握J2ME的安全结构.
.字符匹配.
.java指南之使用图形:使用原始图.
.使用消息框.
.JDeveloper 10g 预览版中使用 JS.
.JAVA中文问题及最优解法.
.IsRootFolder 属性.
.巧用JAVASCRIPT代码限制文本字节.
.Java中文问题详解,底层编码解剖.
.应用Java技术实现数据库应用系统.
.tomcat的sqlserver数据源的配置.
.谈java的学习方向.
.现在应该考 SCJP 1.2 还是 SCJP .
.教你如何成为一个Eclipse热键高手.
.Java I/O API之性能分析.
.Struts 1.2.2 新功能全新体验.
.JAVA学习,是一条漫长的道路(转贴.
.数组在Java编程中的应用.

java 线程安全

发表日期:2008-1-5


 

四种方式    sychronized要害字

  1. sychronized method(){}
  2. sychronized (objectReference) {/*block*/}
  3. static synchronized method(){}
  4. sychronized(classname.class)

其中1和2是代表锁当前对象,即一个对象就一个锁,3和4代表锁这个类,即这个类的锁
要注重的是sychronized method()不是锁这个函数,而是锁对象,即:假如这个类中有两个方法都是sychronized,那么只要有两个线程共享一个该类的reference,每个调用这两个方法之一,不管是否同一个方法,都会用这个对象锁进行同步。锁的3和4类推,即该类的不同reference调用了sychronized区段的咚咚就会受类锁的控制

还有,假如两个函数调用的先后顺序不能被打断,那么可以有个专门的锁对象来完成这个任务:
class MyLock
{
      synchronized getLock()
      {
          //####还没写完
      }
}

五个等级   参见effective Java  Item 52 : Document thread safety

  1. immutable   不可变对象
  2. thread-safe 线程安全的,可以放心使用,如java.util.Timer
  3. conditionally thread-safe 条件线程安全的,如Vector和Hashtable,一般是安全的,除非存在几个方法调用之间的顺序不能被打断,这时可以用额外的锁来完成
  4. thread-compatible 可以使用synchronized (objectReference)来协助完成对线程的调用
  5. thread-hostile 不安全的

wait & notifyAll

在循环中使用wait 使用notifyAll而不是notify

pipe

java中也有pipe的,四个类:PipedInputStream, PipedInputReader, PipedOutputStream, PipedOutputWriter 下面是一段生产者消费者的代码(摘自core javaII):

    /* set up pipes */
    PipedOutputStream pout1 = new PipedOutputStream();
    PipedInputStream pin1 = new PipedInputStream(pout1);
    PipedOutputStream pout2 = new PipedOutputStream();
    PipedInputStream pin2 = new PipedInputStream(pout2);
    /* constrUCt threads */
    Producer prod = new Producer(pout1);
    Filter filt = new Filter(pin1, pout2);
    Consumer cons = new Consumer(pin2);
    /* start threads */
    prod.start(); filt.start(); cons.start();

注重

long 和double是简单类型中两个非凡的咚咚:java读他们要读两次,所以需要同步
死锁是一个经典的多线程问题,因为不同的线程都在等待那些根本不可能被释放的锁,从而导致所有的工作都无法完成。假设有两个线程,分别代表两个饥饿的人,他们必须共享刀叉并轮流吃饭。他们都需要获得两个锁:共享刀和共享叉的锁。假如线程 "A" 获得了刀,而线程 "B" 获得了叉。线程 A 就会进入阻塞状态来等待获得叉,而线程 B 则阻塞来等待 A 所拥有的刀。这只是人为设计的例子,但尽管在运行时很难探测到,这类情况却时常发生。虽然要探测或推敲各种情况是非常困难的,但只要按照下面几条规则去设计系统,就能够避免死锁问题:
  • 让所有的线程按照同样的顺序获得一组锁。这种方法消除了 X 和 Y 的拥有者分别等待对方的资源的问题。
  • 将多个锁组成一组并放到同一个锁下。前面死锁的例子中,可以创建一个银器对象的锁。于是在获得刀或叉之前都必须获得这个银器的锁。
  • 将那些不会阻塞的可获得资源用变量标志出来。当某个线程获得银器对象的锁时,就可以通过检查变量来判定是否整个银器集合中的对象锁都可获得。假如是,它就可以获得相关的锁,否则,就要释放掉银器这个锁并稍后再尝试。
  • 最重要的是,在编写代码前认真仔细地设计整个系统。多线程是困难的,在开始编程之前具体设计系统能够帮助你避免难以发现死锁的问题。
Volatile 变量. volatile 要害字是 Java 语言为优化编译器设计的。以下面的代码为例:

上一篇:Hibernate入门 > JBX + Sqlserver2k 快速上手例子 人气:570
下一篇:使用 Easy Struts for Eclipse 开发 Struts 人气:971
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐