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 ...
随机推荐
-
(转)Mybatis高级映射、动态SQL及获得自增主键
原文:http://www.cnblogs.com/edwinchen/p/4105278.html?utm_source=tuicool&utm_medium=referral 一.动态SQ ...
-
ionic cordova 热更新
因为项目需要,使用cordova的热更新插件,本地调试很简单,看连接https://github.com/nordnet/cordova-hot-code-push,就几步,这里不说了. 下面两个要装 ...
-
Bootstrap系列 -- 39. 导航条添加标题
在Web页面制作中,常常在菜单前面都会有一个标题(文字字号比其它文字稍大一些),其实在Bootstrap框架也为大家做了这方面考虑,其通过“navbar-header”和“navbar-brand”来 ...
-
Git merge local repository
I've met this problem for so many times and let me write a blog for solving this problem. First, you ...
-
zk leader选举自动完成
server 1: [root@wx03 bin]# ./zkServer.sh status ZooKeeper JMX enabled by default Using config: /zook ...
-
C# Unity游戏开发——Excel中的数据是如何到游戏中的 (三)
本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二) 前几天有点事情所以没有继续更新,今天我们接着说.上个帖子中我们看到已经把Excel数据生成了.bin的文件,不过其 ...
-
关于JQuery中$.get()和$.post()和$.ajax()的区别和使用
首先,这三个方法都是Ajax方法中一种与服务器交换数据的请求类型. 一.$.get() $.get() 方法使用 HTTP GET 请求从服务器加载数据. 使用格式: $.get(url,[data] ...
-
spring boot(九)定时任务
在我们的项目开发过程中,经常需要定时任务来帮助我们来做一些内容,springboot默认已经帮我们实行了,只需要添加相应的注解就可以实现 1.pom包配置 pom包里面只需要引入springboot ...
-
python3.8 新特性
https://docs.python.org/3.8/whatsnew/3.8.html python 3.8的新功能本文解释了与3.7相比,python 3.8中的新特性. 有关完整的详细信息,请 ...
-
mysql 常用指令集合
show variables ——显示系统变量(扩展show variables like 'XXX') 在MYSQL的主从复制中 ,通过命令show master status,可以查看maste ...