`
guzizai2007
  • 浏览: 359609 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

synchronized关键字

    博客分类:
  • Java
 
阅读更多

1、synchronized关键字:

1)、可用来修饰一个方法或代码块
2)、作用:保证在同一时刻只能有一个线程来访问当前对象的这段代码

2、例子(对代码块加锁,两个线程同时跑,一定要等第一个线程执行完跑完,第二个才执行):

package com.sxit.test;

public class Test implements Runnable{

	public static void main(String[] args) {
		
		Test test1 = new Test();
		Thread thread1 = new Thread(test1,"线程1");
		Thread thread2 = new Thread(test1,"线程2");
		
		thread1.start();
		thread2.start();
	}
	
	public void run() {
		//对当前对象加锁,同一时刻只能有一个线程持有当前对象的锁,一定要等第一个线程执行完,锁释放后,第二个线程才开始跑
		synchronized (this) {
			for(int i = 0 ;i<50;i++){
				System.out.println("当前线程是:"+Thread.currentThread().getName()+"------>>>跑到"+i);
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
}


-----------打印信息(太长,只截取一部分)-----------
当前线程是:线程1------>>>跑到0
当前线程是:线程1------>>>跑到1
当前线程是:线程1------>>>跑到2
当前线程是:线程1------>>>跑到3
当前线程是:线程1------>>>跑到4
当前线程是:线程1------>>>跑到5
。。。。。。。。。。。。。。。。。
当前线程是:线程1------>>>跑到49
当前线程是:线程2------>>>跑到0
当前线程是:线程2------>>>跑到1
当前线程是:线程2------>>>跑到2
当前线程是:线程2------>>>跑到3
当前线程是:线程2------>>>跑到4
当前线程是:线程2------>>>跑到5
当前线程是:线程2------>>>跑到6
。。。。。。。。。。。。。。。。。
当前线程是:线程2------>>>跑到49

3、例子(一个线程访问当前对象同步方法,另外一个线程可以访问该对象的非同步方法):

package com.sxit.test;

public class Test implements Runnable{

	public static void main(String[] args) {
		
		Test test1 = new Test();
		//启一个线程
		Thread thread1 = new Thread(test1,"线程1");
		
		thread1.start();
		//当前线程执行test方法
		test1.test();
	}
	
	public void run() {
		//对当前对象加锁,同一时刻只能有一个线程持有当前对象的锁,一定要等第一个线程执行完,锁释放后,第二个线程才开始跑
		synchronized (this) {
			for(int i = 0 ;i<50;i++){
				System.out.println("当前线程是:"+Thread.currentThread().getName()+"------>>>跑到"+i);
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	public void test(){
		try {
			for(int i = 0 ;i<50;i++){
				Thread.sleep(100);
				System.out.println("当前线程是:"+Thread.currentThread().getName()+"----->>>访问非同步方法"+i);
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

----------打印结果-------------
当前线程是:线程1------>>>跑到46
当前线程是:main----->>>访问非同步方法45
当前线程是:main----->>>访问非同步方法46
当前线程是:线程1------>>>跑到47
当前线程是:线程1------>>>跑到48
当前线程是:main----->>>访问非同步方法47
当前线程是:main----->>>访问非同步方法48
当前线程是:线程1------>>>跑到49
当前线程是:main----->>>访问非同步方法49

4、例子:(当一个线程访问synchronized声明的代码块时,别的线程访问其他synchronized代码块时将被堵塞):

package com.sxit.test;

public class Test implements Runnable {

	public static void main(String[] args) {

		Test test1 = new Test();
		// 启一个线程
		Thread thread1 = new Thread(test1, "线程1");
		thread1.start();
		
		try {
			//主线程先睡一会儿,让线程1先执行
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		// 当前主线程main执行test方法将被堵塞,知道线程1执行完释放当前对象锁才能执行test方法
		test1.test();
	}

	public void run() {
		// 对当前对象加锁,同一时刻只能有一个线程持有当前对象的锁,一定要等第一个线程执行完,锁释放后,第二个线程才开始跑
		synchronized (this) {
			for (int i = 0; i < 100; i++) {
				System.out.println("当前线程是:" + Thread.currentThread().getName() + "------>>>跑到" + i);
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

	public void test() {
		synchronized (this) {
			for (int i = 0; i < 50; i++) {
				System.out.println("当前线程是:" + Thread.currentThread().getName() + "----->>>访问非同步方法" + i);
			}
		}
	}
}


---------打印信息-----------
当前线程是:线程1------>>>跑到1
当前线程是:线程1------>>>跑到2
。。。。。。。。。。。。。。。。
当前线程是:线程1------>>>跑到49
当前线程是:线程main------>>>跑到1
。。。。。。。。。。。。。。。。
当前线程是:线程main------>>>跑到49

5、Thread类中start()方法源码:

	/**
	 * Causes this thread to begin execution; the Java Virtual Machine 
	 * calls the run method of this thread. 
	 *  线程开始执行;JVM会调用该线程的run方法,也就是调用Runnable的run方法 见源码即:
	 * 	public void run() {
	 *      //target是构造器传入的Runnable对象,如果不为空,则调用它的Run方法
	 * 		if (target != null) { 
	 * 			target.run();
	 *  	}
	 *  }
	 * 
	 * The result is that two threads are running concurrently: the 
	 * current thread (which returns from the call to the 
	 * start method) and the other thread (which executes its 
	 * run method). 
	 * 
	 * It is never legal to start a thread more than once.
	 * 重复调用start方法启动线程是非法的
	 * In particular, a thread may not be restarted once it has completed
	 * execution.
	 * 如果线程已经执行完毕,不能再重复启动了
	 * 见源码started标示
	 *
	 * @exception  IllegalThreadStateException  if the thread was already
	 *               started.
	 */
	//synchronized关键字修饰,防止同一时刻有多个线程一起启动
	public synchronized void start() {
		if (started)
			throw new IllegalThreadStateException();
		//如果已经启动了,则started标示为true,下一次启动直接抛出异常
		started = true;
		//将当前线程加入到线程组中
		group.add(this);
		start0();
	}

	// native方法里执行 闭源无法看到
	private native void start0();

	public void run() {
		if (target != null) {
			target.run();
		}
	}

6、小结:

1)、每个类实例都对应一把锁,如果你要访问该对象的synchronized方法,你就首先得先获得这把锁,否则所属线程阻塞,方法一旦执行,就独占此锁,知道方法返回后才将锁释放,被阻塞的线程也就可以去争取这个锁了。

  

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    java多线程中synchronized关键字的用法

    java多线程中synchronized关键字的用法 解压密码 www.jiangyea.com

    java的线程同步机制synchronized关键字的理解_.docx

    Java 线程同步机制中 synchronized 关键字的理解 Java 的线程同步机制是为了解决多个线程共享同一片存储空间所带来的访问冲突问题。其中,synchronized 关键字是 Java 语言中解决这种冲突的重要机制。 ...

    java同步synchronized关键字用法示例

    Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源时的同步机制。在Java中,当多个线程试图同时访问和修改同一块代码或数据时,可能会导致数据不一致的问题。为了解决这个问题,...

    深入理解Java中的synchronized关键字:同步机制与应用

    Java提供了多种机制来处理并发问题,其中synchronized关键字是最基本也是最常用的同步手段之一。本文将深入探讨synchronized关键字的工作原理、使用方式以及在实际编程中的应用。 synchronized关键字是Java中实现...

    实例解析Java中的synchronized关键字与线程平安问题_.docx

    Java 中的 synchronized 关键字与线程平安问题 在 Java 中,synchronized 关键字是一个非常重要的概念,它用于解决线程同步问题。但是,很多开发者对 synchronized 关键字的理解并不够深入,本文将通过实例解析 ...

    synchronized关键字的用法详解

    ### synchronized关键字的深入解析 #### 一、synchronized关键字的重要性 `synchronized`关键字在Java语言中扮演着极其重要的角色,它是实现线程安全的核心手段之一。通过`synchronized`关键字,开发人员可以在多...

    Java并发编程:Synchronized关键字深度解析

    本文深入探讨了Java中用于解决并发编程中线程安全问题的synchronized关键字。文章首先讨论了多线程编程中临界资源的概念,包括对象、变量、文件等,以及同步机制的必要性。重点解析了synchronized的工作原理,包括其...

    【Java并发编程】Synchronized关键字实现原理.doc

    Java 并发编程 Synchronized 关键字实现原理 Synchronized 关键字是 Java 并发编程中最基本的同步机制,它可以保证线程安全,包括原子性、可见性和有序性。Synchronized 关键字可以修饰方法或代码块,使得在同一...

    java基本教程之synchronized关键字java多

    一、synchronized关键字的作用与原理 `synchronized`关键字主要有两个作用:同步方法和同步块。它通过锁机制来实现线程同步,防止多个线程同时执行同一段代码,可能导致的数据不一致问题。 1. 同步方法:当在方法...

    Lock接口与synchronized关键字

    ### Lock接口与synchronized关键字详解 #### 一、概述 在Java并发编程中,Lock接口与synchronized关键字都是实现同步的重要工具。它们虽然都用于控制多线程对共享资源的访问,但在使用方式、功能特性及灵活性方面...

    Synchronized关键字的用法

    ### Synchronized关键字在Java中的应用 #### 概述 `synchronized`是Java语言中的一个关键字,主要用于实现线程同步,防止多个线程同时访问共享资源而导致的数据不一致问题。通过`synchronized`关键字,开发者可以...

    synchronized关键字的实质及用法

    《深入理解Java中的synchronized关键字》 在Java编程语言中,`synchronized`关键字是用于实现线程同步的重要工具,它的本质在于确保多线程环境下的数据一致性与安全性。通过`synchronized`,我们可以控制对共享资源...

    Java并发-Synchronized关键字.docx

    本文将探讨Synchronized关键字在解决并发控制中的作用及其使用方式。 首先,让我们回顾一下问题的背景:在给出的示例代码中,创建了10个线程,每个线程都对共享变量`count`进行10000000次的累加操作。理论上,最终...

    java synchronized关键字原理、自定义一把锁来实现同步等

    ### Java synchronized 关键字原理与自定义锁实现详解 #### 一、Java synchronized 关键字原理 `synchronized` 是 Java 中的关键字之一,用于实现线程间的同步控制,确保共享资源的安全访问。它主要应用于以下两种...

    java实现单例模式-懒汉模式(线程安全,使用synchronized关键字)

    线程安全,使用synchronized关键字

    5-4JVM内置锁synchronized关键字详解.mp4

    5-4JVM内置锁synchronized关键字详解.mp4

    Java中的同步机制:深入理解synchronized关键字

    synchronized关键字是Java中实现线程同步的基本工具,它通过锁定对象的monitor来控制对共享资源的并发访问。理解synchronized的工作原理和使用方式对于编写线程安全的Java程序至关重要。然而,由于其局限性,开发者...

    Java 多线程与并发(4-26)-关键字- synchronized详解.pdf

    "Java 多线程与并发(4-26)-关键字- synchronized详解" Java 多线程与并发中的 synchronized 关键字是实现同步块的互斥访问和线程的阻塞及唤醒等工作的重要工具。下面将对 synchronized 关键字进行详细分析。 ...

    Java synchronized关键字使用方式及特性解析

    需要注意的是,synchronized关键字的使用需要遵守一定的原则,例如避免使用synchronized关键字在循环语句中,以免出现死锁等问题。此外,synchronized关键字也可以与其他线程同步工具结合使用,以实现更复杂的线程...

Global site tag (gtag.js) - Google Analytics