java中synchronized关键字的测试
最近由于各种原因迫使自己需要详细了解java的基本知识,之前在学校学java多线程的时候,很多很重要的知识点都是一带而过。
我们来回忆一下java中synchronized关键字的用途(一下内容属个人理解,欢迎读者修正!):
1:synchronized 修饰静态方法时候,在任何时候jvm都保证只有一个线程访问方法内部的代码,因此保证了许多静态的对象不被意外的修改,解决了多线程下静态对象的数据不同步问题。
看以下测试代码:
package thread;
public class TestSynchronized extends Thread {
/**
* 测试输出的次数
*/
private static int times;
/**
* 定义三个线程
*/
private static Thread t1 = new TestSynchronized("t1");
private static Thread t2 = new TestSynchronized("t2");
private static Thread t3 = new TestSynchronized("t3");
/**
* 开始测试时间
*/
private static long start;
TestSynchronized(String name){
super(name);
}
/**
* @param args
*/
public static void main(String[] args) {
start = System.currentTimeMillis();
t1.start();
t2.start();
t3.start();
}
public void run(){
for(int i=0;i<50;i++){
log(getName(),i);
}
//打印最长话费时间 以最后打印的为标准
System.out.println(getName()+"已经结束。花费时间:"+(System.currentTimeMillis()-start));
}
synchronized static void log(Object id,Object msg){
times++;
msg(id," 进来了。。");
msg(id,msg);
try {
Thread.sleep(100);
} catch (Exception e) {e.printStackTrace();}
msg(id," 出来了。。");
}
static void msg(Object id,Object msg){
System.out.println(times+":"+id+">>"+msg);
}
}
其中我们一“times” 为要我们要同步的数据,每次log的时候times将被自加一次,在只有一个线程访问该方法的情况下可以很正常的打印出times对应的输出。但是在多线程的环境下就会很容易出现错位的现象,以上代码的部分输出(三个线程)如下:
第3次log,线程:t2>>log start。。
第3次log,线程:t2>>0
第3次log,线程:t1>>log start。。
第3次log,线程:t1>>0
第3次log,线程:t3>&
相关文档:
XSD文件 (XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。 具体使用方法和定义请参看:
http://www.w3school.com.cn/schema/index.asp
java自jdk1.5以上新增了SchemaFactory类 可以实现对XSD验证的支持,使用起来也很方便。
以下代码可用在JDK1.5+ 验证xml
public class SimpleErrorHandler i ......
如果你不需要内部类对象与其外围类对象之间有联系,那你可以将内部类声明为static。这通常称为嵌套类(nested class)。想要理解static应用于内部类时的含义,你就必须记住,普通的内部类对象隐含地保存了一个引用,指向创建它的外围类对象。然而,当内部类是static的时,就不是这样了。嵌套类意味着:
1. 要 ......
认识多任务、多进程、单线程、多线程
要认识多线程就要从操作系统的原理说起。
以前古老的DOS操作系统(V 6.22)是单任务的,还没有线程的概念,系统在每次只能做一件事情。比如你在copy东西的时候不能rename文件名。为了提高系统的利用效率,采用批处理来批量执行任务。
现在的操作系统都是多任务操作系统, ......
Lombok是一种JavaArchive(JAR)文件,可用来消除Java代码的冗长。通过在开发环境中实现Lombok,开发人员可以节省构建诸如hashCode()和equals()这样的方法以及以往用来分类各种accessor和mutator的大量时间。
我们看这样一个例子,一个标准的Javabean。一个典型的Javabean一般具有几个属性。每个属性具有一个accessor和mutat ......
Java读取地理信息数据文件,并将其存入Oracle数据库。
package file;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; ......