java学习:对synchronized的测试

平时对synchronized这个关键字没有太在意,对它的认识停留在粗略翻了一下百度百科的状态,百度百科对它的解释是:

“Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问object的一个加锁代码块时,另一个线程仍然可以访问该object中的非加锁代码块。”

理解得比较宽泛,下面详细描述一下synchronized这个关键字的功能:

首先,synchronized的工作方式是,获得一个  对象的实例 / 类  的锁,然后执行它所包含的代码块,如果不能获得锁,则等待。

注意,这里的锁是在 [对象的实例] 或者 [类] 上的。

synchronized有两种用法,代码块和方法,如下:

public void testMethod(){
    synchronized(this){
        //todo something
    }
}

public static synchronized void testMethod(){
        //todo something
}

对于代码块的用法而言,synchronized锁定的就是它的括号里的对象或者类;

对于方法的用法而言,静态方法时,synchronized锁定的是这个类;非静态方法时,synchronized锁定的是当前的对象,相当于synchronized(this);

例子:

public class TestSynchronized {
    public void print1(){
        synchronized (""){
            System.out.println("1");
        }
    }

    public void print2() {
        synchronized (this) {
            System.out.println("2");
        }
    }

    public synchronized void print3() {
        System.out.println("3");
    }

    public synchronized static void print4() {
        System.out.println("4");
    }

    public static void print5(){
        synchronized (TestSynchronized.class) {
            System.out.println("5");
        }
    }
}

执行print1时,可执行的有:2345,其他实例不能执行1

执行print2时,可执行的有:145,不影响其他实例

执行print3时,可执行的有:145,不影响其他实例

执行print4时,可执行的有:123

执行print5时,可执行的有:123

时间: 2024-10-24 10:00:35

java学习:对synchronized的测试的相关文章

关于JAVA多线程并发synchronized的测试与合理使用

在项目开发中, 或许会碰到JAVA的多线程处理, 为保证业务数据的正常, 必须加上锁机制,  常用的处理方法一般是加上synchronized关键字, 目前JDK版本对synchronized已经做了很好的优化,  我们不用再考虑其性能,  但在实际使用中,  往往由于处理不当,  导致系统性能的严重下降, 那么该如何合理的使用synchronized,  必须对其使用方式有个全面了解, 在网上搜寻的资料, 给出的是四种使用方式, 其实可总结为两种, 一个是同步代码块, 一个是同步方法体, 那么

【原】Java学习笔记013 - 阶段测试

1 package cn.temptation; 2 3 import java.util.Scanner; 4 5 public class Sample01 { 6 public static void main(String[] args) { 7 // 需求:编写程序打印如下效果:(杨辉三角变体) 8 // 1 9 // 1 1 10 // 1 2 1 11 // 1 3 3 1 12 // 1 4 6 4 1 13 // 1 5 10 10 5 1 14 15 // 思路:使用二维数组

java学习记录---synchronized

1 public class TestSync implements Runnable{ 2 Timer timer = new Timer(); 3 public static void main(String args[]){ 4 TestSync test = new TestSync(); 5 Thread t1 = new Thread(test); 6 Thread t2 = new Thread(test); 7 t1.setName("t1"); 8 t2.setNam

java学习笔记14--多线程编程基础1

本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为一个进程,例如:用字处理软件编辑文稿时,同时打开mp3播放程序听音乐,这两个独立的程序在同时运行,称为两个进程 进程要占用相当一部分处理器时间和内存资源 进程具有独立的内存空间 通信很不方便,编程模型比较复杂 多线程 一个程序中多段代码同时并发执行,称为多线程,线程比进程开销小,协作和数据交换容易

Java 学习文章汇总

目前JAVA可以说是产业界和学术界最热门的语言,许多人都很急切想把JAVA学好. 但学习是需要步骤的,除非像电影中演的那样,能够把需要的专业技巧下载到脑海:主角只花了几秒下载资料,就马上具备飞行员的技巧,或是武侠小说中的运功传送内力的方式,否则花上一段时间苦学是少不了的.花时间,不打紧,就怕方法错误,事倍功半. java 学习文章推荐.java学习线路.java 知识图谱. HTML5 微数据 RDFa/微格式 使用 jQuery 的 Autocomplete 插件实现input输入提示功能 创

疯狂Java学习笔记(37)----------List集合

在网上找了很长时间关于List集合的资料,发现都是代码,理论性的东西太少了,对于想要深入的学习我来说,很困难呀,光看代码,不能解决问题呀!所以,自己精心的搜刮来了一点资料在这整理了一下! List集合! ·List列表 ·list: list代表有序.可重复集合,每个元素都有对应的索引,所以List集合中的元素可以重复.List集合默认暗元素的添加顺序设计元素! ·list当然也用于collection中的所有方法,并且自己也有添加了额外的方法,所有List实现类都可以调用这些方法来操作元素.L

Java学习-008-判断文件类型实例

此文源码主要为应用 Java 如何判断文件类型的源码及其测试源码.若有不足之处,敬请大神指正,不胜感激!源代码测试通过日期为:2015-2-2 23:02:00,请知悉. Java 判断文件类型源码如下所示: 1 /** 2 * @function 判断文件类型 3 * 4 * @author Aaron.ffp 5 * @version V1.0.0: autoUISelenium main.java.aaron.java.tools FileUtils.java assertFileType

【分享】不知道怎么学java?java学习路线送上!让你不再迷茫!

学习Java之前,先别急,静下心来好好想想:1)你对学习Java是否有兴趣?2)你是否能静下心来坚持不懈地学习?嗯,这是个容易但又绝对不应该忽略的问题,你确信自己对Java感兴趣.而且又有吃苦的准备,那你才可能学好Java!如果具备这两点条件,就请继续往下看(帖子后面我会分享一些java学习教程)Java体系涉及到三个方面:J2SE,J2EE,J2ME(KJAVA).(1)J2SE--Java 2 Platform Standard Edition,即JDK,它是三者的基础,属于桌面级应用开发:

Java学习之InputStream中read()与read(byte[] b)

Java学习之InputStream中read()与read(byte[] b) 这两个方法在抽象类InputStream中都是作为抽象方法存在的, JDK API中是这样描述两者的: read() :  从输入流中读取数据的下一个字节,返回0到255范围内的int字节值.如果因为已经到达流末尾而没有可用的字节,则返回-1.在输入数据可用.检测到流末尾或者抛出异常前,此方法一直阻塞. read(byte[] b) :  从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中.以整数形式返回

Java学习-023-Properties 类 XML 配置文件读取及写入源代码

之前的几篇 Properties 文章已经讲述过了 Java 配置文件类 Properties 的基本用法,查看 JDK 的帮助文档时,也可看到在 Properties 类中还有两个方法 loadFromXML(InputStream) 和 storeToXml(OutputStream, String, String),由方法名中的 xml 不难确定这两个方法分别是读取/写入数据到 xml 文件.JDK 文档部分如下所示: 因而此文将通过源码实例演示 Properties 类是如何将数据写入