请教各位大神,通常javaweb都是单例多线程的吗
举个栗子
你用杯子喝可乐,喝完了不刷,继续去倒果汁喝,就是单例。
你用杯子喝可乐,直接扔了杯子,换个杯子去倒果汁喝,就是多例。
数据库连接池就是单例模式,有且仅有一个连接池管理者,管理多个连接池对象。
1 什么是单例多例:
所谓单例就是所有的请求都用一个对象来处理,比如我们常用的service和dao层的对象通常都是单例的,而多例则指每个请求用一个新的对象来处理,比如action;
2 如何产生单例多例:
在通用的SSH中,单例在spring中是默认的,如果要产生多例,则在配置文件的bean中添加scope="prototype";
3 为什么用单例多例:
之所以用单例,是因为没必要每个请求都新建一个对象,这样子既浪费CPU又浪费内存;
之所以用多例,是为了防止并发问题;即一个请求改变了对象的状态,此时对象又处理另一个请求,而之前请求对对象状态的改变导致了对象对另一个请求做了错误的处理;
用单例和多例的标准只有一个:
当对象含有可改变的状态时(更精确的说就是在实际应用中该状态会改变),则多例,否则单例;
单例其实就在内存中该对象只有一个内存对应地址。无论你多少个线程访问那个对象,都是同一个地址。这样节省内存
4 何时用单例?何时用多例?
对于struts2来说,action必须用多例,因为action本身含有请求参数的值,即可改变的状态;
而对于struts1来说,action则可用单例,因为请求参数的值是放在actionForm中,而非action中的;
另外要说一下,并不是说service或dao一定是单例,标准同第3点所讲的,就曾见过有的service中也包含了可改变的状态,同时执行方法也依赖该状态,但一样用的单例,这样就会出现隐藏的BUG,而并发的BUG通常很难重现和查找;
随着计算机技术的发展 编程模型也越来越复杂多样化 但多线程编程模型是目前计算机系统架构的最终模型 随着CPU主频的不断攀升 X 架构的硬件已经成为瓶 在这种架构的CPU主频最高为 G 事实上目前 G主频的CPU已经接近了顶峰
如果不能从根本上更新当前CPU的架构(在很长一段时间内还不太可能) 那么继续提高CPU性能的方法就是超线程CPU模式 那么 作业系统 应用程序要发挥CPU的最大性能 就是要改变到以多线程编程模型为主的并行处理系统和并发式应用程序
所以 掌握多线程编程模型 不仅是目前提高应用性能的手段 更是下一代编程模型的核心思想 多线程编程的目的 就是 最大限度地利用CPU资源 当某一线程的处理不需要占用CPU而只和I/O OEMBIOS等资源打交道时 让需要占用CPU资源的其它线程有机会获得CPU资源 从根本上说 这就是多线程编程的最终目的
第一需要弄清的问题
如同程序和进程的区别 要掌握多线程编程 第一要弄清的问题是 线程对象和线程的区别
线程对象是可以产生线程的对象 比如在java平台中Thread对象 Runnable对象 线程 是指正在执行的一个指点令序列 在java平台上是指从一个线程对象的start()开始 运行run方法体中的那一段相对独立的过程
鉴于作者的水平 无法用更确切的词汇来描述它们的定义 但这两个有本质区别的概念请初学者细细体会 随着介绍的深入和例程分析的增加 就会慢慢明白它们所代表的真实含义
天下难事必始于易 天下大事必始于细
让我们先从最简单的 单线程 来入手 ( )带引号说明只是相对而言的单线程 ( )基于java
class BeginClass{ public static void main(String[] args){ for(int i= ;i< ;i++) System out println( Hello World! ); } }
如果我们成功编译了该java文件 然后在命令行上敲入
java BeginClass
现在发生了什么呢每一个java程序员 从他开始学习java的第一分钟里都会接触到这个问题 但是 你知道它到底发生发什么
JVM进程被启动 在同一个JVM进程中 有且只有一个进程 就是它自己 然后在这个JVM环境中 所有程序的运行都是以线程来运行 JVM最先会产生一个主线程 由它来运行指定程序的入口点 在这个程序中 就是主线程从main方法开始运行 当main方法结束后 主线程运行完成 JVM进程也随之退出
我们看到的是一个主线程在运行main方法 这样的只有一个线程执行程序逻辑的流程我们称
之为单线程 这是JVM提供给我们的单线程环境 事实上 JVM底层还至少有垃圾回收这样的后台线程以及其它非java线程 但这些线程对我们而言不可访问 我们只认为它是单线程的
主线程是JVM自己启动的 在这里它不是从线程对象产生的 在这个线程中 它运行了main方法这个指令序列 理解它 但它没有更多可以研究的内容
接触多线程
class MyThread extends Thread{ public void run(){ System out println( Thread say:Hello World! ); } } public class MoreThreads{ public static void main(String[] args){ new MyThread(); new MyThread() start(); System out println( Main say:Hello World ); } }
执行这个程序 main方法第一行产生了一个线程对象 但并没有线程启动
main方法第二行产生了一个线程对象 并启动了一个线程
main方法第三行 产生并启动一个线程后 主线程自己也继续执行其它语句
lishixinzhi/Article/program/Java/gj/201311/27552
Java
JAVA 是 Sun 公司推出的新一代面向对象的程序设计语言, 由于它与生俱来的一些特性, 比如: 平台无关, 多线程, 内置 URL 操作, 高度安全性等等, 使得它特别适合于网络应用程序的开发 经过多年的发展, JAVA 已经成为这方面的主流编程语言 而且, 随着 Internet 的崛起, JAVA 将会有更大的发展
在 JAVA 流行之前, C++ 已经流行很久了, 几乎在第三代编程语言中起统治地位, 初学 JAVA 的人会觉得两者很像 事实上, 可以说 JAVA 就是脱胎与 C++, 但同时又做了相当大的改变, 使其更加符合网络编程的需要
JAVA几个重要的特性:
Easy :Java的语法比C++的相对简单,另一个方面就是Java能使软件在很小的机器上运行,基础解释其和类库的支持的大小约为40kb,增加基本的标准库和线程支持的内存需要增加125kb。
分布式 :Java带有很强大的TCP/IP协议族的例程库,Java应用程序能够通过URL来穿过网络来访问远程对象,由于servlet机制的出现,使Java编程非常的高效,现在许多的大的web server都支持servlet。
OO :面向对象设计是把重点放在对象及对象的接口上的一个编程技术其面向对象和C++有很多不同,在与多重继承的处理及Java的原类模型。
健壮特性 :Java采取了一个安全指针模型,能减小重写内存和数据崩溃的可能型。
安全 :Java用来设计网路和分布系统,这带来了新的安全问题,Java可以用来构建防病毒和防攻击的System事实证明Java在防毒这一方面做的比较好。
中立体系结构 :Java编译其生成体系结构中立的目标文件格式可以在很多处理器上执行,编译器产生的指令字节码(Javabytecode)实现此特性,此字节码可以在任何机器上解释 执行。
所以它较慢。
可移植性 :Java中对基本数据结构类型的大小和算法都有严格的规定所以可移植性很好。
多线程 :Java处理多线程的过程很简单,Java把多线程实现交给底下操作系统或线程程序完成所以多线程是Java作为服务器端开发语言的流行原因之一 。
Applet和servlet :能够在网页上执行的程序叫Applet,需要支持Java的浏览器很多,而applet支持动态的网页,这是很多其他语言所不能做到的。
引自不同网络
原理是这样的,服务器端有一个客户端管理器,负责管理所有连接进来的客户端,另外还需要为这个客户端管理器注册一个监听器,监听客户端的连接与断开两个动作,有客户端连接进来,就会触发监听器,监听器获取该客户端的在线好友列表,向在线的好友推送上线提醒消息,客户端断开时,也会出发监听器,监听器获取该客户端的在线好友列表,向在线的好友推送下线提醒消息
0条评论