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使用的区别的更多相关文章

  1. Java的synchronized的同步代码块和同步方法的区别

    synchronized同步方法和同步代码块的区别 同步方法默认使用this或者当前类做为锁. 同步代码块可以选择以什么来加锁,比同步方法更精确,我们可以选择只有会在同步发生同步问题的代码加锁,而并不 ...

  2. (原)测试 Java中Synchronized锁定对象的用法

    今天再android_serial_port中看到了关键字 synchronized;因为刚好在学java和android,所以就查了一下它的用法: 于是把代码中的一小段代码拿了出来,做了一下修改,测 ...

  3. JAVA多线程synchronized详解

    Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 当两个并发线程访问同一个对象object中的这个synchronized(this)同 ...

  4. java.lang.UnsatisfiedLinkError: no XXX in java.library.path

    其中涉及的测试源码如下: For those who didn't install Javawith default settings, a systematic way for solving JN ...

  5. Java锁-Synchronized深层剖析

    Java锁-Synchronized深层剖析 前言 Java锁的问题,可以说是每个JavaCoder绕不开的一道坎.如果只是粗浅地了解Synchronized等锁的简单应用,那么就没什么谈的了,也不建 ...

  6. No.1.测试Synchronized加锁String字符串后的多线程同步状况

    测试目的描述 Synchronized关键字锁定String字符串可能会带来严重的后果, 尽量不要使用 synchronized(String a) 因为JVM中,因为字符串常量池具有缓冲功能! 接下 ...

  7. java 并发——synchronized

    java 并发--synchronized 介绍 在平常我们开发的过程中可能会遇到线程安全性的问题,为了保证线程之间操作数据的正确性,我们第一想到的可能就是使用 synchronized 并且 syn ...

  8. 使用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 ...

  9. Java并发-Synchronized关键字

    一.多线程下的i++操作的并发问题 package passtra; public class SynchronizedDemo implements Runnable{ private static ...

随机推荐

  1. NODE.JS开发指南学习笔记2

    1.核心模块 核心模块是Node.js的心脏,由一些精简高效的库组成,为其提供了基本的API.2.全局对象 global.所有的的全局变量都是其属性.其根本的作用是作为全局变量的宿主.3.全局变量 1 ...

  2. Maven系列二setting.xml 配置详解

    文件存放位置 全局配置: ${M2_HOME}/conf/settings.xml 用户配置: ${user.home}/.m2/settings.xml note:用户配置优先于全局配置.${use ...

  3. MMDrawerController的使用

    1.http://www.jianshu.com/p/9e55cbf7d5ab  MMDrawerController的使用

  4. Location 对象

    Location 对象 Location 对象包含有关当前 URL 的信息. Location 对象是 window 对象的一部分,可通过 window.Location 属性对其进行访问. 注意: ...

  5. Java核心技术点之集合框架

    1. 概述     Java集合框架由Java类库的一系列接口.抽象类以及具体实现类组成.我们这里所说的集合就是把一组对象组织到一起,然后再根据不同的需求操纵这些数据.集合类型就是容纳这些对象的一个容 ...

  6. python执行linux shell管道输出内容

    干净不留痕,用过都说好. echo "print 1+1" |python

  7. .NET:Entity Framework 笔记

    有二年没关注EF,今天无意试了下发现跟主流的Hibernate等ORM框架越来越接近了,先看下Entity类的定义: using System; using System.Collections.Ge ...

  8. React Native开发技术周报1

    (一).资讯 1.React Native 0.21版本发布,最新版本功能特点,修复的Bug可以看一下已翻译 重要:如果升级 Android 项目到这个版本一定要读! 我们简化了 Android 应用 ...

  9. Laravel 下结合阿里云邮件推送服务

    最近在学习laravel做项目开发,遇到注册用户推送邮件的问题,之前用java做的时候是自己代码写的,也就是用ECS推送邮件,但是现在转php的laravel了就打算用php的邮件发送功能来推送邮件, ...

  10. web性能优化——简介

    简介 性能优化的第一准则:加缓存.几乎绝大部分优化都围绕这个来进行的.让用户最快的看到结果. 性能优化的第二准则:最小原则.绝不提供多余的信息.比如,静态资源(图片.css.js)压缩,图片的滚动加载 ...