synchronized (s1) {
s1.append("D");
System.out.print(s2);
System.out.print(s1);
}
}
}
}.start();
}
}
//例3.可能死锁的线程
public class SyncTest {
public static void main(String[] args) {
final StringBuffer s1 = new StringBuffer();
final StringBuffer s2 = new StringBuffer();
new Thread() {
public void run() {
synchronized (s1) {
s2.append("A");
synchronized (s2) {
s2.append("B");
System.out.print(s1);
System.out.print(s2);
}
}
}
}.start();
new Thread() {
public void run() {
synchronized (s2) {
s2.append("C");
synchronized (s1) {
s1.append("D");
System.out.print(s2);
System.out.print(s1);
}
}
}
}.start();
}
}
对例3的分析【网友】
如果没有出现死锁,那么输出的结果必然是:"ABABCD"; 如果没有输出此结果;那么死锁
原因:T1启动在前, T2启动在后;且T1的第一步操作为:synchronized(s1)
1. 由于T1执行过慢---> T2要执行第一步:synchronized(s2)--->寻找s1,被T1锁住等待--->T1寻找说说s2,被T2锁住等待 ; 出现死锁
2. T1执行过快-->s1,s2都被锁住--->T2执行,等待-->T1执行完:"AB" -->T2执行:"ABCD"
十八.web服务器
Web服务器说白了就是提供web应用的基础功能:
1. 它是遵从http协议的一个服务器端程序,按照http提供基本的请求解析、应答处理等
2. 它提供了供web程序运行的最直接的环境,比如tomcat就是一个servlet的容器
3. 它提供了对线程的管理,包括创建,调度,撤销等
4. 它提供请求地址与具体地址的对应处理
。。。
B/S是在C/S架构基础上发展起来的一种技术,相比C/S,B/S主要有以下几点的不同,这里不比较哪个优越,况且优越与否是和具体环境关联的,单独不能说哪个好,
1. B/S是遵从http协议的,即采用的是标准的协议,
2. B/S的客户端已开发好(就遵从http协议的浏览器),不需要程序员再开发
3. B/S的服务器端业界也提供了基础功能的实现(各种web容器)
一个C/S示例(多线程),希望在它的基础上能更好的理解web服务器
1. 客户端程序:MultiTalkClient.java
[java]
import java.io.*;
import java.net.*;
public class MultiTalkClient {
public static void main(String args[]) {
try{
Socket socket=new Socket("127.0.0.1",4700);
//向本机的4700端口发出客户请求
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
//由系统标准输入设备构造BufferedReader对象
PrintWriter os=new PrintWriter(socket.getOutputStream());
//由Socket对象得到输出流,并构造PrintWriter对象
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//由Socket对象得到输入流,并构造相应的BufferedReader对象
String readline;
readline=sin.readLine(); //从系统标准输入读入一字符串
while(!readline.equals("bye")){
//若从标准输入读入的字符串为 "bye"则停止循环
os.println(readline);
//将从系统标准输入读入的字符串输出到Server
os.flush();
//刷新输出流,使Server马上收到该字符串
System.out.println("Client:"+readline);
//在系统标准输出上打印读入的字符串
System.out.println("Server:"+is.readLine());
//从Server读入一字符串,并打印到标准输出上
readline=sin.readLine();
//从系统标准输入读入一字符串
} //继续循环
os.close(); //关闭Socket输出流
is.close(); //关闭Socket输入流
socket.close(); //关闭Socket
}catch(Exception e) {
System.out.println("Error"+e); //出错,则打印出错信息
}
}
}
import java.io.*;
import java.net.*;
public class MultiTalkClient {
public static void main(String args[]) {
try{
Socket socket=new Socket("127.0.0.1",4700);
//向本机的4700端口发出客户请求
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
//由系统