`

Synchronized同步代码块关键字

 
阅读更多

 

 * synchronized的使用,其实是对象锁,可以锁定方法(对当前对象锁定),也可以锁定代码块(锁定单独的对象)

 * 1 当n个线程同时执行对一个对象锁定的代码块时,则同一时间只能有一个线程执行

 * 

 * 场景设想:

 *  有一个车主想要出租自己的一个车(一个对象锁),

 *  可是有5个人同时想租这个车主的车(5个线程)

 *  那么这5个人按顺序分别租这个人的车,每个人租赁完成,下一个继续租(5个线程分别执行这段代码)

 

1  代码块的锁(可以是一个对象或者是class),锁定的是一个对象,则同时只能有一个线程执行这个代码块

    

public class TestSyn implements Runnable{
	 
	private  Integer counter=0; 
	private  String  waitLock ; 
	
	public TestSyn( String waitLock, int counter2 ) {
		this.counter = counter2 ; 
		this.waitLock = waitLock ; 
	}

	public static void main(String[] args) {
		String waitLock =""; 
		for(int i=0;i<3;i++){
			
			TestSyn d = new TestSyn( waitLock,i);
			new Thread(d).start(); 
		}
	}

	@Override
	public void run() {
		//所有的线程都获得waitLock对象的锁,所以同一时刻只能有一个线程执行代码块
		//与括号中放TestSyn.class是相同的 ,其实TestSyn.class也是一个对象
		 synchronized (waitLock ) {
			System.out.println("子线程启动=="+counter);
			 try {
				Thread.sleep(5000);
			}catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("子线程结束"+counter);
		}
	}
}

  

 

  结果:一个一个执行

子线程启动==0
子线程结束0
子线程启动==2
子线程结束2
子线程启动==1
子线程结束1

 

 

 

 

2 方法锁,锁定的是当前对象,则N个线程同时执行这个对象的同步方法,只能有一个线程执行方法

  设想场景同上。

 

   

public class TestSyn2 implements Runnable{
	private  CarOwner owner ;
	
	public TestSyn2( CarOwner owner ) {
		this.owner = owner ; 
	}

	public static void main(String[] args) {
		CarOwner owner = new CarOwner();
		for(int i=0;i<3;i++){
			//创建3个租车的人,每个人都需要和车主租车
			TestSyn2 renter = new TestSyn2( owner );//
			new Thread(renter).start(); 
		}
	}

	@Override
	public void run() {
		//打印说明线程是同步开始的
		System.out.println( "当前线程开始"+Thread.currentThread().getName());
		owner.rentCar(); 
		//System.out.println( "当前线程结束"+Thread.currentThread().getName());
	}
}
//车主  
class CarOwner{
	//线程工作
	public synchronized void rentCar(){
		//统一时刻只能有一个线程执行这个方法
		System.out.println( "同步当前线程开始"+Thread.currentThread().getName());
		 try {
			Thread.sleep(5000);
		}catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println( "同步当前线程结束"+Thread.currentThread().getName());
	}
}

 

 

 

 

 

 

分享到:
评论

相关推荐

    java同步synchronized关键字用法示例

    - **代码块同步:** 也可以使用`synchronized`关键字来同步代码块,这样可以更细粒度地控制同步范围,提高程序性能。 ```java public void method() { synchronized (object) { // 代码块 } } ``` 这里的`object...

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

    1. 无论 synchronized 关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁。 2. 每个对象只有一个锁(lock)与之相关联。 3. 实现同步是要很大的系统开销作为代价的,甚至可能造成死锁...

    同步代码块(synchronized).zip

    同步代码块的关键字是`synchronized`,它的主要作用是确保同一时间只有一个线程可以访问特定的代码区域,即实现了线程互斥。这在处理共享资源或临界区时尤其重要,防止多个线程同时修改导致数据错误。 同步代码块的...

    synchronized关键字的用法详解

    在方法声明中添加`synchronized`关键字,可以将整个方法体变成同步代码块。例如: ```java public class Example { private int value; public synchronized void accessVal(int newVal) { value = newVal; //...

    java中synchronized(同步代码块和同步方法)详解及区别

    本篇文章将详细介绍`synchronized`的两种形式:同步代码块和同步方法,并分析它们的区别。 1. **同步代码块 (Synchronized Block)** 同步代码块的语法结构如下: ```java synchronized (object) { // 需要同步...

    Synchronized关键字的用法

    1. **同步代码块**:可以通过`synchronized`关键字来声明同步代码块,即通过指定对象锁来实现同步。 ```java synchronized (object) { // 需要同步执行的代码 } ``` - 这种方式中,`object`对象作为锁,任何...

    并发编程原理学习:synchronized关键字.doc

    `synchronized`关键字可以用于修饰方法或作为同步代码块,其核心目标是保证线程对共享资源的访问具有互斥性和可见性,防止数据不一致和竞态条件。 ### 同步代码块 同步代码块的形式如下: ```java synchronized ...

    Java多线程-同步机制解决线程安全问题方式一:同步代码块

    当线程通过`synchronized`关键字进入同步代码块或同步方法时,它会获取对象的锁。如果锁已被其他线程持有,那么该线程将会被阻塞,直到锁被释放。锁的状态存储在对象头的Mark Word中,包括线程ID等信息。 三、同步...

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

    2. 同步块:使用`synchronized`关键字配合一个对象实例或者类的Class对象,形成一个同步代码块。这种方式更加灵活,可以锁定代码块中的部分代码。 二、监视器对象与锁 每个Java对象都可以作为锁,`synchronized`...

    synchronized关键字的实质及用法

    当线程进入同步代码块或同步方法时,会获取到对应的锁,执行完后释放。其他线程在获取到锁之前会被阻塞等待。 3. **互斥性** 由于监视器锁的机制,`synchronized`保证了在同一时刻,只有一个线程能执行特定的同步...

    深入理解java中的synchronized关键字

    - 如果一个线程在一个对象的`synchronized(this)`块中,其他线程仍然可以访问该对象的非`synchronized(this)`代码块。 - 对象锁仅适用于该对象的`synchronized`代码块,不影响其他线程对其他对象的访问。 以下是...

    【IT十八掌徐培成】Java基础第08天-03.多线程-同步代码块-同步方法.zip

    同步代码块是通过`synchronized`关键字包裹一段代码,确保同一时间只有一个线程可以执行这段代码。其语法格式如下: ```java synchronized (object) { // 需要同步的代码 } ``` 这里的`object`是监视器对象,它...

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

    synchronized 关键字可以应用在方法和代码块中,以实现互斥同步原语。通过 synchronized 关键字,我们可以对对象锁和类锁进行操作,从而实现线程安全。 synchronized 关键字的原理 synchronized 关键字的原理是...

    java_synchronized详解

    - **解释**:线程`t1`访问的是`myt2`的`synchronized(this)`同步代码块,而线程`t2`访问的是`myt2`的非同步代码块`m4t2()`。因此,两个线程可以同时运行。 3. **多个同步代码块之间的访问** - **修改后的代码**:...

    java 中同步方法和同步代码块的区别详解

    同步方法和同步代码块是Java中实现同步的主要方式,它们都用于解决线程安全问题,但有各自的特点和适用场景。 同步方法是通过在方法声明前加上`synchronized`关键字来实现的。例如: ```java public synchronized ...

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

    Synchronized 关键字可以修饰方法或代码块,可以实现同步锁。Synchronized 原理可以分为三部分:Synchronized 修饰方法、Synchronized 修饰代码块和 ObjectMonitor 源码。 2.1、Synchronized 修饰方法 ...

    C++大厂面试真题宝典 精选100道完结7章

    但是volatile 关键字只能用于变量而 synchronized 关键字可以修饰方法以及代码块 volatile 关键字能保证数据的可见性,但不能保证数据的原子性。synchronized 关键字两者都能保证。 volatile关键字主要用于解决变量...

    【ASP.NET编程知识】实例解析Java中的synchronized关键字与线程安全问题.docx

    2. **synchronized 方法**:当`synchronized`关键字应用于方法时,整个方法体被视为同步代码块,作用对象是调用该方法的对象。对于非静态方法,锁住的是实例对象;对于静态方法,锁住的是类的Class对象,即全局锁。 ...

    详解java中的synchronized关键字

    另一方面,`synchronized`也可以用于同步代码块,这样可以更加精确地控制锁的范围: ```java public void m4t1() { synchronized(this) { // 同步代码块 } } ``` 在这个例子中,即使在一个线程执行`m4t1()`时,...

Global site tag (gtag.js) - Google Analytics