* 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()); } }
相关推荐
- **代码块同步:** 也可以使用`synchronized`关键字来同步代码块,这样可以更细粒度地控制同步范围,提高程序性能。 ```java public void method() { synchronized (object) { // 代码块 } } ``` 这里的`object...
1. 无论 synchronized 关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁。 2. 每个对象只有一个锁(lock)与之相关联。 3. 实现同步是要很大的系统开销作为代价的,甚至可能造成死锁...
同步代码块的关键字是`synchronized`,它的主要作用是确保同一时间只有一个线程可以访问特定的代码区域,即实现了线程互斥。这在处理共享资源或临界区时尤其重要,防止多个线程同时修改导致数据错误。 同步代码块的...
在方法声明中添加`synchronized`关键字,可以将整个方法体变成同步代码块。例如: ```java public class Example { private int value; public synchronized void accessVal(int newVal) { value = newVal; //...
本篇文章将详细介绍`synchronized`的两种形式:同步代码块和同步方法,并分析它们的区别。 1. **同步代码块 (Synchronized Block)** 同步代码块的语法结构如下: ```java synchronized (object) { // 需要同步...
1. **同步代码块**:可以通过`synchronized`关键字来声明同步代码块,即通过指定对象锁来实现同步。 ```java synchronized (object) { // 需要同步执行的代码 } ``` - 这种方式中,`object`对象作为锁,任何...
`synchronized`关键字可以用于修饰方法或作为同步代码块,其核心目标是保证线程对共享资源的访问具有互斥性和可见性,防止数据不一致和竞态条件。 ### 同步代码块 同步代码块的形式如下: ```java synchronized ...
当线程通过`synchronized`关键字进入同步代码块或同步方法时,它会获取对象的锁。如果锁已被其他线程持有,那么该线程将会被阻塞,直到锁被释放。锁的状态存储在对象头的Mark Word中,包括线程ID等信息。 三、同步...
2. 同步块:使用`synchronized`关键字配合一个对象实例或者类的Class对象,形成一个同步代码块。这种方式更加灵活,可以锁定代码块中的部分代码。 二、监视器对象与锁 每个Java对象都可以作为锁,`synchronized`...
当线程进入同步代码块或同步方法时,会获取到对应的锁,执行完后释放。其他线程在获取到锁之前会被阻塞等待。 3. **互斥性** 由于监视器锁的机制,`synchronized`保证了在同一时刻,只有一个线程能执行特定的同步...
- 如果一个线程在一个对象的`synchronized(this)`块中,其他线程仍然可以访问该对象的非`synchronized(this)`代码块。 - 对象锁仅适用于该对象的`synchronized`代码块,不影响其他线程对其他对象的访问。 以下是...
同步代码块是通过`synchronized`关键字包裹一段代码,确保同一时间只有一个线程可以执行这段代码。其语法格式如下: ```java synchronized (object) { // 需要同步的代码 } ``` 这里的`object`是监视器对象,它...
synchronized 关键字可以应用在方法和代码块中,以实现互斥同步原语。通过 synchronized 关键字,我们可以对对象锁和类锁进行操作,从而实现线程安全。 synchronized 关键字的原理 synchronized 关键字的原理是...
- **解释**:线程`t1`访问的是`myt2`的`synchronized(this)`同步代码块,而线程`t2`访问的是`myt2`的非同步代码块`m4t2()`。因此,两个线程可以同时运行。 3. **多个同步代码块之间的访问** - **修改后的代码**:...
同步方法和同步代码块是Java中实现同步的主要方式,它们都用于解决线程安全问题,但有各自的特点和适用场景。 同步方法是通过在方法声明前加上`synchronized`关键字来实现的。例如: ```java public synchronized ...
Synchronized 关键字可以修饰方法或代码块,可以实现同步锁。Synchronized 原理可以分为三部分:Synchronized 修饰方法、Synchronized 修饰代码块和 ObjectMonitor 源码。 2.1、Synchronized 修饰方法 ...
但是volatile 关键字只能用于变量而 synchronized 关键字可以修饰方法以及代码块 volatile 关键字能保证数据的可见性,但不能保证数据的原子性。synchronized 关键字两者都能保证。 volatile关键字主要用于解决变量...
2. **synchronized 方法**:当`synchronized`关键字应用于方法时,整个方法体被视为同步代码块,作用对象是调用该方法的对象。对于非静态方法,锁住的是实例对象;对于静态方法,锁住的是类的Class对象,即全局锁。 ...
另一方面,`synchronized`也可以用于同步代码块,这样可以更加精确地控制锁的范围: ```java public void m4t1() { synchronized(this) { // 同步代码块 } } ``` 在这个例子中,即使在一个线程执行`m4t1()`时,...