详解ThreadLocal与synchronized



详解ThreadLocal与synchronized

Java 良好的支持多线程。使用java,我们可以很轻松的编程一个多线程程序。但是使用多线程可能会引起并发访问的问题。synchronized和 ThreadLocal都是用来解决多线程并发访问的问题。大家可能对synchronized较为熟悉,而对ThreadLocal就要陌生得多了。

并发问题。

当一个对象被两个线程同时访问时,可能有一个线程会得到不可预期的结果。

一个简单的java类Student,代码:
public class Student {
private int age=0;
public i[......]

Read more

Spring Stream ResultSet



Spring Stream ResultSet.

class StreamingStatementCreator implements PreparedStatementCreator {
private final String sql;

public StreamingStatementCreator(String sql) {
this.sql = sql;
}

@Override
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException[......]

Read more

JAVA多线程同步

JAVA多线程同步.因为需要,最近关注了一下JAVA多线程同步问题。JAVA多线程同步主要依赖于若干方法和关键字。将心得记录如下:
1 wait方法:
该方法属于Object的方法,wait方法的作用是使得当前调用wait方法所在部分(代码块)的线程停止执行,并释放当前获得的调用wait所在的代码块的锁,并在其他线程调用notify或者notifyAll方法时恢复到竞争锁状态(一旦获得锁就恢复执行)。
调用wait方法需要注意几点:
第一点:wait被调用的时候必须在拥有锁(即synchronized修饰的)的代码块中。
第二点:恢复执行后,从wait的下一条语句开始执行,因而wai[......]

Read more

java throw关键字

java throw关键字.

声明某方法抛出异常的原因:
包含该方法的类可以被不同的类调用,该方法应告知可能会产生异常
调用该方法的类应该捕获异常

可能产生异常的方法并不确切地知道该如何处理该异常事件
向该方法的调用者抛出异常,异常对象可以从调用栈向后传播,知道有核实的方法捕获它为止
异常传递到main方法后结束,交给JVM处理

在一个方法声明中的throws字句中指明
public int read()throws IOException
{……}
在throws字句中可以同时指明多个异常,之间由逗号隔开
public static void main(St[......]

Read more

Java多线程技术

Java多线程技术.

多线程的优势:
减轻编写交互频繁,涉及面多的程序的困难(如监听网络端口)
程序的吞吐量会得到改善(同时监听多种设备,如网络端口、串口、并口以及其他外设)
多处理器系统可以并发运行不同的线程(否则,任何时刻只有一个线程在运行)

在JAVA中通过提供Thread类来实现多线程
在JAVA中线程由三部分组成:
虚拟CPU,封装在java.lang.Thread类中,控制整个线程的运行;
执行的代码,传递给Thread类,由Thread类控制顺序执行;
处理的数据,传递给Thread类,在代码执行过程中所要处理的数据

创建多线程的两种方法:继承Th[......]

Read more

java基本的线程控制

java基本的线程控制.

基本的线程控制:
终止线程
测试线程状态
线程的暂停和恢复

终止线程
线程终止后其生命周期就结束了,即进入死亡态,终止后的线程不能再倍调度执行,以下几种情况,线程进入终止状态:
线程执行完run()方法后,会自然终止
通过调用线程的实例方法stop()来终止线程

测试线程状态
可以通过Thread中的isAlive()方法来获取线程是否处于活动状态
线程由start()方法启动后,直到被终止之间的任何时刻都处于Alive状态

线程的暂停和恢复
暂停一个线程的执行,在适当的时候再恢复其执行的方法:
sleep()方法
当前线[......]

Read more

java线程的调度

java线程的调度.

线程的调度
线程调度器来监控程序中启动后进入就绪状态的所有线程
线程调度器按照线程的优先级决定调度哪些线程来执行
线程调度器按线程优先级高低选择高优先级线程(进入运行中状态)执行,同时线程调度是抢先式调度,即如果在当前线程执行过程中,一个更高优先级的线程进入可运行状态,则这个线程立即被调度执行

下面几种情况下,当前线程会放弃CPU:
线程调用了yield()或sleep()方法主动放弃
由于当前线程进行I/O访问、外存读写,等待用户输入等操作,导致线程阻塞;
为等候一个条件变量,以及线程调用wait()方法
抢先式系统下,由于高优先级的线程参与调[......]

Read more

java多线程的同步

java多线程的同步.

临界资源问题
独立的线程异步执行
每个线程都包含了运行时所需要的数据或方法,不需要外部的资源或方法,不必关心其他线程的状态或行为

同步运行的线程需要共享数据,需考虑其他线程的状态和行为,否则,不能保证程序的运行结果的正确性
例子
class stack
{
int idx=0;//堆栈指针的初始值为0
char[] date=new char[6];//堆栈有6个字符的空间
public void push(char c)//压栈操作
{
data[idx]=c;//数据入栈
idx++;//指针向上移动一位
}
public ch[......]

Read more

java InputStream与OutputStream

InputStream与OutputStream.

InputStream类:程序可以从中连续读取字节的对象
抽象类,不能表明具体对应哪种设备
子类:网络、管道、内存、文件等具体的IO设备
FileInputStream类:节点流类,即文件输入流
流节点(Node):节点流对应的IO源和目标

InputStream类的方法
从流中读取数据:
int read();//读取一个字节,返回值是所读取的字节
int read(byte b[]);//读取多个字节,放置到字节数组b中,通常读取的字节数量为b的长度,返回值为实际读取的字 //节的数量
int read(byt[......]

Read more

File类

File类.

java.io包,定义各种方式的输入输出的类
File类,I/O包中唯一代表磁盘文件本身的对象
定义了一些与平台无关的方法来操纵文件,包含创建、删除文件,重命名文件,判断文件的读写权限及是否存在,设置和查询文件的最近修改时间

在Java中,目录也被当作File使用,只是多了一些目录特有的功能
可以用list方法列出目录中的文件名
在Unix下的路径分隔符为/,在dos下的路径分隔符为\
File类不能访问文件的内容,即不能读写,只能对文件本身的属性进行操作

java.io包中有关文件处理的类:File、FileInputStream、FileOutputS[......]

Read more