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 ...
随机推荐
- Object.Destroy慎用
Object.Destory Destory(Object)并没有立刻,马上,及时的删除这个Object. 举例 在使用NGUI的Table或Grid进行布局时,就需要注意了:尽量不要使用Destro ...
- easyUI的dateBox控制时间格式
<input type='text' name='yearQuery' class='easyui-datebox ' data-options="formatter:myformat ...
- 使用javascript对密码进行有密码强度提示的验证
好些网站的注册功能中,都有对密码进行验证并且还有强度提示.下面就来实现这种效果.密码强度说明:密码强度:弱——纯数字,纯字母,纯符号密码强度:中——数字,字母,符号任意两种的组合密码强度:强——数字, ...
- nginx应用总结(2)--突破高并发的性能优化
在日常的运维工作中,经常会用到nginx服务,也时常会碰到nginx因高并发导致的性能瓶颈问题.今天这里简单梳理下nginx性能优化的配置(仅仅依据本人的实战经验而述,如有不妥,敬请指出~) 一.这里 ...
- PHP-数组函数
今天在写一个给第三方同步数据的接口时遇到一个这种情况,我有一大坨数据,但是第三方只需要其中的几个而已,不及思索的就开始foreach $ret = array(); foreach ($needPar ...
- 在SecureCRT中使用rz和sz传输文件
首先检查Centos中有没有安装 lrzsz sudo yum install lrzsz 使用yum install的时候碰到一个问题, 不知道是否和虚拟机环境有关 Existing lock /v ...
- C# 发送邮件,QQ企业邮箱测试成功
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.N ...
- NOI2018准备 Day10
效率低低低低低非常低!!!!!!!!!!!!!!!!!!!!!!! noi3.3 布尔表达式 做了2个晚上做不出来... 不过今晚上A了一道很水的找规律题
- unix环境高级编程基础知识之第四章
1.从当前用户转到root用户:直接输入su命令,然后输入root密码,如果之前没有设置root命令密码会登陆不成功,这里需要命令sudo passwd命令设置密码,然后按照上面输入就成:从root命 ...
- 快速备份和还原 MySQL 数据库的另一种方法
一直使用 SQL Server 作为公司产品的数据库来存储系统数据,所以备份还原一直都不是问题,因为 SQL Server 的备份还原非常迅速和易用.但今年公司改变策略,使用起 MySQL 数据库作为 ...