今天突然看到synchronized关键字,想到了并发,就查看了java的api以及stackoverflow的一些资料,为方便记忆,总结如下:
1.synchronized关键字是控制不同线程对同一对象的访问的,对不同对象的访问根本不需要设置这个关键字
2.wati和notify,notifyall关键字一定是出现在synchronized关键字修饰的代码块或函数中,用来做线程同步(类似操作系统中的进程同步的原语操作),至于为什么一定是在synchronized关键字修饰的代码块或函数中,则是由线程同步的要求所规定,它们就是访问同一对象的,只要是不同线程访问同一对象就一定要加synchronized关键字
3.非static代码块和函数synchronized上锁是对这一对象的所有非static的synchronized代码块和函数上锁,同一时刻只能有一个线程访问这些非static的synchronized代码块和函数
4.static的代码块和函数如果被synchronized修饰,则表示这个类的class对象被上锁,就是所有static和synchronized一起修饰的上锁
5. 3和4中所描述的两种情况毫无关系,换句话说就是一个线程锁static的,另一个线程锁非static的情况下,它们各自执行各自的,互相不干扰
6.函数中定义的变量是每个线程在内存中有自己的一份,不用考虑同步问题。而对象的成员变量则需要考虑同步问题,所有线程共享一份
7.我们的apache服务器中的servlet实例都是单例的,自然就涉及到同步问题,但是在doGet等方法中定义的变量不需要考虑同步问题,且我们这些方法也没有synchronized修饰,说明同一时刻我们也没有上锁,允许多个线程同时访问,这样服务器并发性就好了
以上为自己观点,如有不正确,欢迎拍砖!
另:发现apache的并发性在访问量瞬时很大的情况下并没有nginx的并发性好,只是一个结论,有时间从结构上再分析原因