java-测试synchronized使用xxx.class和this使用的区别
synchronized测试1
写两个线程调用同一个方法,在其中分别做一个class和this的调用,看结果
1.xx.class
public class Test{
public static void main(String[] args) {
System.out.println(new Date().toLocaleString()+";开始创建t1...");
Thread t1 = new Thread(new Runnable() {
public void run() {
new Test().test("t1");
}
});
System.out.println(new Date().toLocaleString()+";开始执行t1...");
t1.start();
System.out.println(new Date().toLocaleString()+";开始创建t2...");
Thread t2 = new Thread(new Runnable() {
public void run() {
new Test().test("t2");
}
});
System.out.println(new Date().toLocaleString()+";开始执行t2...");
t2.start();
} public void test(String n){
System.out.println(new Date().toLocaleString()+";"+n+"来了");
synchronized (Test.class) {
System.out.println(new Date().toLocaleString()+";"+n+" 我在这里休眠5秒");
try {
Thread.sleep(5*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(new Date().toLocaleString()+";"+n+" 结束");
}
}
打印
2015-10-19 13:56:46;开始创建t1...
2015-10-19 13:56:47;开始执行t1...
2015-10-19 13:56:47;开始创建t2...
2015-10-19 13:56:47;t1来了
2015-10-19 13:56:47;t1 我在这里休眠5秒
2015-10-19 13:56:47;开始执行t2...
2015-10-19 13:56:47;t2来了
2015-10-19 13:56:52;t2 我在这里休眠5秒
2015-10-19 13:56:52;t1 结束
2015-10-19 13:56:57;t2 结束
从打印的结果可以看出,使用class在执行到synchronized时会等待其他占用的线程执行玩才会继续执行
2.对比this
//将上面的案例中的synchronized (Test.class) { 修改成
synchronized (this) {
执行打印输出结果
2015-10-19 14:01:22;开始创建t1...
2015-10-19 14:01:22;开始执行t1...
2015-10-19 14:01:22;开始创建t2...
2015-10-19 14:01:22;t1来了
2015-10-19 14:01:22;开始执行t2...
2015-10-19 14:01:22;t1 我在这里休眠5秒
2015-10-19 14:01:22;t2来了
2015-10-19 14:01:22;t2 我在这里休眠5秒
2015-10-19 14:01:27;t1 结束
2015-10-19 14:01:27;t2 结束
可以看到,使用this执行线程时只会考虑到同一个线程中的同步问题,严格来说是无法达到真正意义上的线程同步
通过调用不同的方法再次测试
首先看使用class代码展示
public class Test{
public static void main(String[] args) {
System.out.println(new Date().toLocaleString()+";开始创建t1...");
Thread t1 = new Thread(new Runnable() {
public void run() {
new Test().test("t1");
}
});
System.out.println(new Date().toLocaleString()+";开始执行t1...");
t1.start();
System.out.println(new Date().toLocaleString()+";开始创建t2...");
Thread t2 = new Thread(new Runnable() {
public void run() {
new Test().test1("t2");
}
});
System.out.println(new Date().toLocaleString()+";开始执行t2...");
t2.start();
} public void test(String n){
System.out.println(new Date().toLocaleString()+";"+n+"来了");
synchronized (Test.class) {
System.out.println(new Date().toLocaleString()+";"+n+" 我在这里休眠5秒");
try {
Thread.sleep(5*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(new Date().toLocaleString()+";"+n+" 结束");
} public void test1(String n){
System.out.println(new Date().toLocaleString()+";"+n+"来了");
synchronized (Test.class) {
System.out.println(new Date().toLocaleString()+";"+n+" 我在这里休眠5秒");
try {
Thread.sleep(5*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(new Date().toLocaleString()+";"+n+" 结束");
}
}
执行打印结果
2015-10-19 14:04:58;开始创建t1...
2015-10-19 14:04:58;开始执行t1...
2015-10-19 14:04:58;开始创建t2...
2015-10-19 14:04:58;t1来了
2015-10-19 14:04:58;t1 我在这里休眠5秒
2015-10-19 14:04:58;开始执行t2...
2015-10-19 14:04:58;t2来了
2015-10-19 14:05:03;t2 我在这里休眠5秒
2015-10-19 14:05:03;t1 结束
2015-10-19 14:05:08;t2 结束
通过打印结果可以看到基本与同一个方法执行的结果相同
同样也做this的测试
//将上面的案例中的synchronized (Test.class) { 修改成
synchronized (this) {
打印结果
2015-10-19 14:08:22;开始创建t1...
2015-10-19 14:08:22;开始执行t1...
2015-10-19 14:08:22;开始创建t2...
2015-10-19 14:08:22;t1来了
2015-10-19 14:08:22;t1 我在这里休眠5秒
2015-10-19 14:08:22;开始执行t2...
2015-10-19 14:08:22;t2来了
2015-10-19 14:08:22;t2 我在这里休眠5秒
2015-10-19 14:08:27;t1 结束
2015-10-19 14:08:27;t2 结束
打印结果基本相同
所以得出:在使用线程同步时,处理特殊情况外基本应该使用class
测试static中的线程同步
public class Test{
public static void main(String[] args) {
System.out.println(new Date().toLocaleString()+";开始创建t1...");
Thread t1 = new Thread(new Runnable() {
public void run() {
test("t1");
}
});
System.out.println(new Date().toLocaleString()+";开始执行t1...");
t1.start();
System.out.println(new Date().toLocaleString()+";开始创建t2...");
Thread t2 = new Thread(new Runnable() {
public void run() {
test("t2");
}
});
System.out.println(new Date().toLocaleString()+";开始执行t2...");
t2.start();
} public static void test(String n){
System.out.println(new Date().toLocaleString()+";"+n+"来了");
synchronized (Test.class) {
System.out.println(new Date().toLocaleString()+";"+n+" 我在这里休眠5秒");
try {
Thread.sleep(5*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(new Date().toLocaleString()+";"+n+" 结束");
} }
打印
2015-10-19 14:10:22;开始创建t1...
2015-10-19 14:10:23;开始执行t1...
2015-10-19 14:10:23;开始创建t2...
2015-10-19 14:10:23;t1来了
2015-10-19 14:10:23;t1 我在这里休眠5秒
2015-10-19 14:10:23;开始执行t2...
2015-10-19 14:10:23;t2来了
2015-10-19 14:10:28;t2 我在这里休眠5秒
2015-10-19 14:10:28;t1 结束
2015-10-19 14:10:33;t2 结束
从结果中可以看出与class执行是一样的,不区分static。
java-测试synchronized使用xxx.class和this使用的区别的更多相关文章
- Java的synchronized的同步代码块和同步方法的区别
synchronized同步方法和同步代码块的区别 同步方法默认使用this或者当前类做为锁. 同步代码块可以选择以什么来加锁,比同步方法更精确,我们可以选择只有会在同步发生同步问题的代码加锁,而并不 ...
- (原)测试 Java中Synchronized锁定对象的用法
今天再android_serial_port中看到了关键字 synchronized;因为刚好在学java和android,所以就查了一下它的用法: 于是把代码中的一小段代码拿了出来,做了一下修改,测 ...
- JAVA多线程synchronized详解
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 当两个并发线程访问同一个对象object中的这个synchronized(this)同 ...
- java.lang.UnsatisfiedLinkError: no XXX in java.library.path
其中涉及的测试源码如下: For those who didn't install Javawith default settings, a systematic way for solving JN ...
- Java锁-Synchronized深层剖析
Java锁-Synchronized深层剖析 前言 Java锁的问题,可以说是每个JavaCoder绕不开的一道坎.如果只是粗浅地了解Synchronized等锁的简单应用,那么就没什么谈的了,也不建 ...
- No.1.测试Synchronized加锁String字符串后的多线程同步状况
测试目的描述 Synchronized关键字锁定String字符串可能会带来严重的后果, 尽量不要使用 synchronized(String a) 因为JVM中,因为字符串常量池具有缓冲功能! 接下 ...
- java 并发——synchronized
java 并发--synchronized 介绍 在平常我们开发的过程中可能会遇到线程安全性的问题,为了保证线程之间操作数据的正确性,我们第一想到的可能就是使用 synchronized 并且 syn ...
- 使用ResponseBodyAdvice统一包装响应返回String的时候出现java.lang.ClassCastException: com.xxx.dto.common.ResponseResult cannot be cast to java.lang.String
代码如下: @Override public ResponseResult<Object> beforeBodyWrite(Object returnValue, MethodParame ...
- Java并发-Synchronized关键字
一.多线程下的i++操作的并发问题 package passtra; public class SynchronizedDemo implements Runnable{ private static ...
随机推荐
- AC日记——单词倒排 1.7 28
28:单词倒排 总时间限制: 1000ms 内存限制: 65536kB 描述 编写程序,读入一行英文(只包含字母和空格,单词间以单个空格分隔),将所有单词的顺序倒排并输出,依然以单个空格分隔. 输 ...
- Linux下mysql新建账号及权限设置
http://www.cnblogs.com/eczhou/archive/2012/07/12/2588187.html 1.权限赋予 说明:mysql部署在服务器A上,内网上主机B通过客户端工具连 ...
- jdbc与 Beanshell PostProcessor 对多条结果的处理
配置了数据库后,可以通过Beanshell对结果进行特别的操作,一下为对多条数据的处理 数据库的配置如图:
- (转载)ORA-14452:试图创建,更改或删除正在使用的临时表中的索引
因为表kol_xx_fin050_temp 为临时表,而且有其他session正在使用. 处理步骤: 1.先从 dba_objects / user_objects中查询到该表的object_id: ...
- java的string常用操作
import java.util.*; public class Demo3 { public static void main(String args[]){ String str = " ...
- JAVA CDI 学习(4) - @Alternative/@Default/@Any & Extension
前面几节学习到的CDI内容,基本上都是hard-code,以硬编码的方式在代码里指定注入类型,这并非依赖注入的本意,依赖注入的优势之一在于“解耦”,这一节我们将学习如何利用配置来动态注入的类型及属性初 ...
- JAVA CDI 学习(3) - @Produces及@Disposes
上一节学习了注入Bean的生命周期,今天再来看看另一个话题: Bean的生产(@Produces)及销毁(@Disposes),这有点象设计模式中的工厂模式.在正式学习这个之前,先来看一个场景: 基于 ...
- JUnit4测试简介
相比于自己写一个测试类,在里面调用调试方法,使用JUnit4进行测试有很多的优点,极大的提高了测试的速度.本文简单介绍如何使用myEclipse10使用JUnit4,方便日后回顾总结. myEclip ...
- SUBLIME TEXT 2中,光标移入移出括号的快捷键设置
无赖右方向键→和End键都在键盘的另一边,每次输入完一个函数,光标在各种括号中间,有什么更好的方式将光标移出来呢?在Sublime Text 2中,我们可以自己设置快捷键: { "keys& ...
- SM2国密证书合法性验证
通常我们遇到过的X509证书都是基于RSA-SHA1算法的,目前国家在大力推行国密算法,未来银行发行的IC卡也都是基于PBOC3.0支持国密算法的,因此我们来学习一下如何验证SM2国密证书的合法性.至 ...