`
Xcupidtx
  • 浏览: 14935 次
社区版块
存档分类
最新评论

java synchronize初探

    博客分类:
  • JAVA
 
阅读更多

java锁机制初探,实例学习

 

 

package com.yjf.image;

public class TT implements Runnable {
	
	int a = 0;
	
	@Override
	public void run() {
		try {
			m1();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public synchronized void m1() throws InterruptedException {
		a = 1000;
		Thread.sleep(5000);
		System.out.println("m1:" + a);
	}
	
	public synchronized void m2() throws InterruptedException {
		Thread.sleep(1000);
		a = 2000;
		System.out.println("m2:" + a);
	}		

	public static void main(String[] args) throws InterruptedException {
		TT tt = new TT();
		Thread t = new Thread(tt);
		t.start();
		Thread.sleep(20);
		tt.m2();
		Thread.sleep(6000);
		System.out.println("main:" + tt.a);
	}
}

 

 

定义了一个线程类TT,实现Runnable接口,两个方法m1和m2都加了锁,main方法有两个线程:线程main和线程t。运行结果为:

m1:1000

m2:2000

main:2000

 

因为m1和m2都加了锁,代码先执行了t.start,即执行到了m1代码块,此时线程睡了5秒,但它睡着的时候还抱着当前对象的锁。在它睡着的过程中,代码执行到tt.m2();,但由于m2是个synchronised的方法,它要执行的话,必须要先获得一把锁,但这把锁被m1抱着,所以必须等到m1执行完成后,m2才能执行。

 

如果把m2的synchronized修饰符去掉,那么运行结果为:

m2:2000

m1:2000

main:2000

因为m1睡着了,抱着当前对象的锁,但m2不是一个synchronized方法,它执行前不用获得锁,所以在m1睡着的过程中,m2先执行完了。

 

如果把m1声明为public static synchronized void m1(),把m2声明为synchronized,把成员变量a变成static,运行结果为:

m2:2000

m1:2000

main:2000

分析:因为m1是static方法,它睡着的时候抱着一把锁,但这把锁不是当前对象的锁,而是当前类的锁。m2执行时,需要获得一把当前对象的锁,它当然可以获得。所以m2比m1先执行完。

 

如果把m2声明为public static synchronized void m2(),把m1声明为public static synchronized void m1(),把tt.m2()改为TT.m2(),执行结果为:

m1:1000

m2:2000

 

main:2000

 

分析:m1睡着的时候锁住了当前类,而m2执行的时候需要获得当前类的锁,所以必须等m1执行完把锁释放后,m2才能执行。

 

最后提一点,main方法中有这几句话:

                 t.start();

Thread.sleep(20);

 

TT.m2();

如果去掉中间这句:Thread.sleep(20);,会出现不一样的结果。因为主线程的优先级大于分支线程,CPU会这样分配时间。t.start(),启动一个线程,实际上不是启动,而是初始化了一个线程t,CPU会先分配时间片给TT.m2(),所以我加个Thread.sleep(20),让主线程睡一会,排除干扰。

 

分享到:
评论

相关推荐

    java synchronize 线程同步

    Java中的`synchronized`关键字是用于实现线程同步的关键机制,主要目的是解决多线程环境下的数据安全问题。当多个线程访问共享资源时,如果没有适当的同步控制,可能会导致数据不一致或者竞态条件等问题。线程同步...

    Java synchronize底层实现原理及优化

    Java synchronize 底层实现原理及优化 在 Java 中,synchronize 是一种锁机制,用于控制并发冲突,避免多个线程同时访问同一个资源。synchronize 底层实现原理及优化是 Java 并发编程中一个重要的概念,本文将详细...

    Java synchronize线程安全测试

    Java中synchronize关键字的使用与线程安全测试 Java语言中,synchronize关键字是一个非常重要的概念,它主要用于解决线程安全问题。在多线程编程中,经常会出现线程安全问题,因为多个线程可能会访问同一个共享资源...

    delphi vcl线程同步synchronize

    Synchronize方法是Delphi中用于在主线程和工作线程之间进行通信的关键工具,确保对用户界面(UI)的操作是安全的。本文将深入探讨Delphi VCL线程同步以及Synchronize方法的工作原理、使用场景和最佳实践。 ### 1. ...

    Java 中synchronize函数的实例详解

    在Java编程语言中,`synchronized`关键字用于实现线程同步,以确保在多线程环境下对共享资源的访问是安全的。当一个方法被声明为`synchronized`时,同一时刻只能有一个线程执行该方法,其他试图访问的线程必须等待...

    Java之Synchronize学习

    Synchronize的几种实现 Synchronize有三种实现。 同步方法,修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁 静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁 修饰代码块...

    synchronized关键字的用法详解

    `synchronized`关键字在Java语言中扮演着极其重要的角色,它是实现线程安全的核心手段之一。通过`synchronized`关键字,开发人员可以在多线程环境中有效地控制对共享资源的访问,避免出现数据不一致的情况。 #### ...

    Synchronize It 3.5文件夹同步器 简体中文界面

    Synchronize It!还有其他特点如下: 1.可以自订许多的项目,包括过滤器、专案、颜色等等。 2.可以进行多种同步任务独立保存和点用,也可组合多个任务一次同步搞定。 3.支持压缩文件的同步。 4.内建二进位文件的比较...

    Java对象锁和类锁全面解析(多线程synchronize

    Java对象锁和类锁是Java多线程编程中至关重要的概念,它们是通过`synchronized`关键字来实现的,用于确保代码在并发环境下的线程安全。在这个全面解析中,我们将深入探讨这两个锁机制,理解它们的工作原理以及如何在...

    FTP_synchronize_0_9_6_1_dll

    FTP_synchronize_0_9_6_1_dll 是一个针对Notepad++文本编辑器的FTP同步插件,主要用于帮助用户实现本地代码与远程服务器之间的文件同步。Notepad++是一款非常流行的开源文本编辑器,尤其受到程序员和Web开发者的喜爱...

    CALL RFC synchronize and asychronize Examples

    以下是关于"CALL RFC synchronize and asychronize Examples"的详细解释。 **同步调用 (Synchronize Call)** 同步调用是立即执行并等待结果返回的方式。在提供的示例`SAPBC415_RFCSYNC_S1`中,我们看到如何通过`...

    synchronize.zip

    在IT行业中,尤其是在Java编程领域,`synchronize.zip`这个文件名可能暗示着一个与同步相关的项目或代码库。从提供的文件列表来看,我们可以推测这是一个关于处理店铺操作任务的系统,比如更新店铺任务...

    synchronize底层实现原理

    synchronize底层实现原理 Java文件想要看字节码通常使用 javap 命令将java的class文件反汇编,具体操作步骤如下: 1. 先写好一个SynchronizedTest.java文件(下面贴出) 2. 在java文件的目录下,使用命令 javac ...

    Java 7 Concurrency Cookbook

    of how to use the new Java 7 Phaser class to synchronize tasks divided into phases. Chapter 4, Thread Executors will teach the readers to delegate the thread management to executors. They allow ...

    java 线程同步 信号量控制同步

    Java 线程同步控制机制 线程同步是 Java 编程中的一种机制,用于控制多个线程之间的资源访问顺序,以避免线程之间的冲突和数据不一致。线程同步的目的就是避免线程“同步”执行,即让多个线程之间排队操作共享资源...

    Java重写重载线程

    ### Java中的方法重载与重写以及线程概念详解 #### 一、方法重载(Overloading) 在Java中,**方法重载**是指在同一个类中定义多个具有相同名称但参数列表不同的方法。这里提到的“参数列表不同”不仅包括参数的...

    学籍管理系统JAVA课程设计

    在JAVA中,可以通过 synchronize 关键字或者使用并发容器如 ConcurrentHashMap 来实现线程安全的数据修改。 再者,学籍变动功能可能包括转学、休学、复学等情况,这些变动需要记录并反映在系统中。设计时应考虑变动...

    java开发坦克大战(实用应用文).doc

    在 Java 中,我们可以使用 Thread 类来创建线程,并使用 synchronize 关键字来实现线程同步。 Java 文件 I/O 操作: Java 提供了多种文件 I/O 操作技术,包括 InputStream、OutputStream、Reader、Writer 等。在 ...

    JAVA开发常用英语单词

    5. Synchronize(同步):Java中同步关键字,用于控制并发访问共享资源的代码块,保证多线程安全。 6. Stack(栈):在计算机科学中,栈是一种数据结构,支持后进先出的操作模式。在Java虚拟机(JVM)中,Java栈...

    Synchronize和ReentrantLock区别.png

    Synchronize(同步锁)和ReentrantLock(可重入锁)都是Java中的常用锁,都是用来保证线程安全的。两者都是同步锁,且都是阻塞同步。阻塞同步:当一个线程获取锁后,其他线程只能等待(进入阻塞态),等待获取锁的...

Global site tag (gtag.js) - Google Analytics