1. 线程同步问题:
1) 关键字synchronized的作用:
a. 每个对象都会有一个锁(lock),当访问该对象声明为synchronized的方法时,该
对象就会被锁住,此时任何其他线程都不能访问该声明为synchronized的方法,
到线程消亡或出现异常,锁解开。其他线程才能访问该声明为synchronized的方法。
b. 如果一对象声明有多个synchronized方法,当某一线程访问其中的任何一个synchronized方法时,该对象就会被锁住。其他线程不能访问其他任何synchronized 方法。
c. 当一个对象声明有多个synchronized static方法时,某一线程访问其中任何一个synchronized static方法,这时锁上的不是该对象,而是该对象所对应的Class对象(java的一个类无论有多少个对象,都会对应唯一个Class对象。)因此,当有多个线程分别访问该类的多个对象的synchronized static方法时,执行都是由顺序。也就是说一个线程先执行完,另一个线程再执行。
d.静态的synchronized方法,锁住的是一个对象;非静态的synchronized方法,锁住的是该对象对应的唯一的Class对象。
e. synchronized代码块:锁住的是synchronized关键字括号里面一个对象。
如: Object obj = new Object();
Synchronized(obj){
具体代码…
}
Synchronized代码块可以达到synchronized方法一样的作用:括号里使用this, synchronized(this).
f. synchronized方法和synchronized代码块比较:synchronized代码块是细粒度的,上锁的范围可以只是几句代码;synchronized方法是粗粒度的,锁的范围就是整个方法。一般推荐使用synchronized代码块。
2. 线程的wait和notify方法:
1) 线程在调用wait(),notify()方法时,首先必须的拥有锁。所以wait方法和notify方法必须的放在synchronized方法或是synchronized代码块中调用。
2) 线程调用wait方法时发生的事:首先该线程会释放锁,然后等待其他线程使用notify方法或notifyAll方法唤醒,重新获得锁,线程才会继续往下执行。
3)wait和notify方法一定会成对出现。
4)notify唤醒的线程是等待中线程的任何一个,是任意的,不确定的。
5)线程在被notify方法唤醒后,应该判断同步中的变量,以免出现变量被其他线程改变的程序的异常情况。
6)线程的wait方法会释放锁的拥有权,而线程的sleep方法只是让线程短暂的休眠一段时间,但并不会释放锁。
1. 网络编程
1) 端口:是介于0-65535之间的数字,其作用是标示电脑上的各个对应的程序。
2) TCP,UDP传输协议:TCP是面向连接的,可靠的,可进行大量数据传输但效率低的协议;UDP是无连接的,不可靠的,每个数据包必须在64kB之内但效率高的协议。
3) URL简单来说就是网址。URL是网络编程的入口。可以通过URL url = new URL(“http://www.baidu.com”)方式来获取一个URL对象,然后通过url.getProtocol(),url.getHost(),url.getFile(),url.getport(),url.getRef()获取协议名,主机名,文件名,端口名,引用名。
4) 通过URL获取输入流的两种方式:
A.(URL url = new URL(“http://www.baidu.com”)URL对象à (URLConncetion conn=url.openConnection())URLConnection对象à (InputStream is =conn.getInputStream())InputStream对象
B. (URL url = new URL(“http://www.baidu.com”)URL对象à (InputStream is =url.openStream())InputStream对象
5) 在多线程下,对于单例模式的饿汉式即在getInstance()方法中创建实例对象,有可能会创建两个对象,出现多线程问题。
6) InetAddress类:表示一个IP地址。主要的静态方法有:InetAddress.getLocalAddress()返回一个本地主机IP,InetAddress.getByName(String hostname)根据hostname返回IP。如:
InetAddress.getByName(“www.sina.com”)就会返回新浪的ip地址。
7) socket:就是连接运行在网络上的两个程序间的双向通信的端点。
8) 使用ServerSocket和Socket实现服务端和客户端的socket通信:
A. ServerSocket类的常用的构造方法:public ServerSocket(int port)作用是创建一个服务端套接字,绑定到一个port接口。如果port=0,那么会绑定到任意可用的接口。
B.ServerSocket的accept方法,将会监听绑定的接口,并会返回一个新的socket.该方法是一个阻塞方法。
C.客户端scoket类的主要构造方法scoket(String host,int port)作用,创建一个套接字(socket),并连接到指定主机的指定端口上。、
D. 实现服务端和客户端的通信,前提必须得获得两个scoket对象的连接,然后才能进行后续的I/O操作。