Java同步与异步详解教程

一、关键字: 

thread(线程)、thread-safe(线程安全)intercurrent(并发的) synchronized(同步的)asynchronized(异步的)、 volatile(易变的)、atomic(原子的)、share(共享) 


二、概念: 

1、 什么时候必须同步?什么叫同步?如何同步? 

       要跨线程维护正确的可见性,只要在几个线程之间共享非 final 变量,就必须使用 synchronized(或 volatile)以确保一个线程可以看见另一个线程做的更改。 

为了在线程之间进行可靠的通信,也为了互斥访问,同步是必须的。这归因于java语言规范的内存模型,它规定了:一个线程所做的变化何时以及如何变成对其它线程可见。 

因为多线程将异步行为引进程序,所以在需要同步时,必须有一种方法强制进行。例如:如果2个线程想要通信并且要共享一个复杂的数据结构,如链表,此时需要确保它们互不冲突,也就是必须阻止B线程在A线程读数据的过程中向链表里面写数据(A获得了锁,B必须等A释放了该锁)。 

为了达到这个目的,java在一个旧的的进程同步模型——监控器(Monitor)的基础上实现了一个巧妙的方案:监控器是一个控制机制,可以认为是一个很小的、只能容纳一个线程的盒子,一旦一个线程进入监控器,其它的线程必须等待,直到那个线程退出监控为止。通过这种方式,一个监控器可以保证共享资源在同一时刻只可被一个线程使用。这种方式称之为同步。(一旦一个线程进入一个实例的任何同步方法,别的线程将不能进入该同一实例的其它同步方法,但是该实例的非同步方法仍然能够被调用)。 

错误的理解:同步嘛,就是几个线程可以同时进行访问。 

同步和多线程关系:没多线程环境就不需要同步;有多线程环境也不一定需要同步。 

锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)。 

互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。 

可见性要更加复杂一

Oracle学习笔记,Oracle完全学习文档

Oracle推荐学习图书:

1.常用用户:scott,sys,system
2.常用设置:
set linesize 长度;
set pagesize 页数;

(注明:演示表(emp))
常用命令:
1.ed 名称 可用可以创建记事本编辑sql信息
@名称/路径 调用
2.conn 用户名/密码 [as sysdba]   用户链接
3.select * from scott.emp; 查询其他用户下的表
4.show user; 显示当前链接的用户
5.select * from tab; 查询所有的表
6.desc emp;  显示表结构
7.类型:
NUMBER(4) 长度为4的数字
VARCHAR2(10) 只能容纳长度为10的字符串
DATE 日期
NUMBER(7,2) 小数位占2位,整数位站5位的数字
8.’/’ 表示继续执行上一个操作

SQL(Structured Query Language 结构化查询语言)语句
DML 数据操作语言
DDL 数据定义语言
DCL 数据控制语言

注:{}表示可选的
1.简单查询语句
select 字段 as 别名 from 表名;
2.去除重复选项 select {distinct} 字段 from 表名;
3.字符串的链接: select ‘字符串’||字段||’字符串’ from 表名;
4.运算符: select 字段[运算符(+/-/*//)]字段 from 表名;
5.限定查询: select * from 表名 where 条件;
>,<,>=,<=,= 条件运算
is not null  不为空
and,or  逻辑运算
between ** and **  在范围之间,包含等于
in  在范围之中:select * from emp where empno in (7369,7499);
like 模糊查询,通配符(%:可以匹配任意长度的内容 _:可以匹配一个长度的内容)
6.结果排序:order by 字段  [asc/desc] 排序
7.单行函数:
select upper(‘字母’) from dual;  –转换为大写
lower(‘字符串’)  –转换为小写
initcap()  –将单词的首字母转换为大写
|| –链接字符串 或者使用 concat()
substr(‘字符串’,开始(可以为负数,表示从后截取),结束)  截取字符串,开始可以从0或者1开始,并且可以使用负数
length(‘字符串’) 长度
replace(‘字符串’,’需要替换的字符串’,’替换为的字符串’)  字符串替换
round(5534.23434,2)  =5534.23 四舍五入
trunc(5534.23434)  将舍弃小数位 trunc(5534.23434,2) 保留后两位小数
mod(10,3)  =1   求余
8.日期函数
select sysdate from dual;  获取当前日期
months_between()   求出给定日期的范围的月数
add_months();   在制定日期上加上之的那个的月数,求出只够的月数
next_day();下一个今天是那一个日期
last_day() 求出给定日期的最后一天的日期
9.转换函数(重要)
to_char()  转换为字符串
to_number() 转换为数字
to_date(‘字符串’,’yyyy’)  转换为日期
nvl(‘字段’,0)  将null值变为指定的内容
重要 decode() 类似于if else
select decode(1,1,’内容是1′,2,’内容是2′,3,’内容是3′) from dual;

多表查询,分组查询,子查询

(后续再发布…)

ejp运行环境

ejp运行环境
  支持Web容器和EJB容器:
  (1)Jboss(4.2以上版本)开源的javaee应用服务器,市场占有第一
  (2)Glassfish sun公司的开源javaee应用服务器,性能高,发展时间短
  (3)WebLogic(10以上的版本) 商业应用服务器,稳定性好,人性化管理,功能强大,但在Ejb上bug较多
  (4)Sun Application Server(9.0以上版本)  商业javaee应用服务器,推荐使用
  (5)Oracle Application Server (10g以上版本) 商业javaee应用服务器,如果使用的是Oracle数据库,能与应用程序有更好的支持,推荐
  (6)apusic国内的javaee商业应用服务器,在政府中占有较大的份额,开发文档较少
  注意:Tomcat只是web容器,无ejb容器,可以集成