synchronized关键字有两种用法。第一种就是使用Synchronized关键字同步类方法。另外一种就是synchronized块
public void add(String name){ synchronized (this) { name = "this->"+name; System.out.println(Thread.currentThread()+"name:"+name); } } public synchronized void delete(String name){ name = "delete-->"+name; System.out.println(Thread.currentThread()+name); }
syncronized块中this和class对象的主要应用区别
1.非静态方法可以使用this或者class对象来同步,而静态方法必须使用class对象来同步并且它们互不影响
2.this是针对当前引用的对象,class对象就是原始对象本身
public class Test{ public static void main(String[] args){ MyThread m = new MyThread("liming"); MyThread m1 = new MyThread("yaotian"); Thread t = new Thread(m); Thread t1 = new Thread(m1); t.start(); t1.start(); } } class MyThread implements Runnable{ private String name; public MyThread(String name){ this.name=name; } public void run() { add(name); } public void add(String name){ synchronized (MyThread.class) { name = "this->"+name; System.out.println(Thread.currentThread()+"name:"+name); delete(name); } } public synchronized void delete(String name){ name = "delete-->"+name; System.out.println(Thread.currentThread()+name); } }
在synchronized同步块中使用了MyThread.class对象作为监视器,并且生成了m,m1对MyThread引用对象,创建了两个线程t,t1来分别访问m,m1,最后得到的结果是:(这个结果是符合预期的结果,线程执行的顺序是先执行add后执行delete)
Thread[Thread-0,5,main]name:this->liming
Thread[Thread-0,5,main]delete-->this->liming
Thread[Thread-1,5,main]name:this->yaotian
Thread[Thread-1,5,main]delete-->this->yaotian
-----------------------------------------------------------------
Thread[Thread-1,5,main]name:this->yaotian
Thread[Thread-1,5,main]delete-->this->yaotian
Thread[Thread-0,5,main]name:this->liming
Thread[Thread-0,5,main]delete-->this->liming
如果我们将add中的同步监视器改为this结果是方法不同步
Thread[Thread-0,5,main]name:this->liming
Thread[Thread-1,5,main]name:this->yaotian
Thread[Thread-0,5,main]delete-->this->liming
Thread[Thread-1,5,main]delete-->this->yaotian
相关推荐
在Java中,`synchronized`有两种使用方式:同步方法和同步代码块。 1. 同步方法: 同步方法是指在方法声明前加上`synchronized`关键字,它会锁定该方法所在的对象。对于非静态方法,锁的是当前对象实例;对于静态...
本篇文章将详细介绍`synchronized`的两种形式:同步代码块和同步方法,并分析它们的区别。 1. **同步代码块 (Synchronized Block)** 同步代码块的语法结构如下: ```java synchronized (object) { // 需要同步...
在 Java 中,synchronized 关键字可以作用于 instance 变量、object reference(对象引用)、static 函数和 class literals(类名称字面常量)身上。 Synchronized 关键字的作用是取得对象的锁,而不是把一段代码或...
synchronized 方法的缺陷是:同一个对象的不同线程之间会形成互斥,而对这个对象所属的 Class 所产生的另一对象却可以任意调用这个被加了 synchronized 关键字的方法。 synchronized 块 除了方法前用 synchronized...
本实例大全将全面解析`synchronized`的使用方式,包括同步方法、同步语句块、类锁和对象锁。 ### 1. 同步方法 同步方法是通过在方法声明前加上`synchronized`关键字实现的。这样,同一时间只有一个线程可以执行该...
在这个例子中,`increment()`和`decrement()`方法都用到了同步代码块,使得计数操作不会因线程并发而出现不正确的结果。 通过这两个示例,我们可以学习到同步代码块在实际编程中的应用,以及如何解决多线程环境下的...
例如,如果在一个类中有两个不同的对象P1和P2,它们各自调用同一个同步方法,这两个线程会形成互斥,即在任何时刻只有一个线程能够执行同步方法。但是,类的其他实例P2可以不受限制地调用这个同步方法,因为每个对象...
在内部类中,`synchronized`关键字同样可以用于同步方法或者同步块。不过,需要注意的是,内部类中的`this`指的是内部类自身,而不是外部类。如果需要同步外部类的方法,需要使用`OuterClass.this`。例如: ```...
本文将深入探讨`synchronized`的几种使用示例,包括方法加锁、代码块加锁(针对`this`和对象)以及静态方法加锁。 1. **方法加锁** 当在实例方法前使用`synchronized`关键字时,它会锁定当前对象的监视器,只有...
在上面的例子中,synchronized 关键字被用于 myMethod 方法上,以防止多个线程同时访问同一个对象的 myMethod 方法。 2. 类范围:synchronized 关键字也可以被用于类范围内,以防止多个线程同时访问同一个类中的...
本测试案例深入探讨了`synchronized`的使用方法,包括同步单个对象、同步多个对象以及成功与失败的场景对比。 一、`synchronized`关键字的基本概念 `synchronized`关键字可以修饰方法或用作代码块,其主要作用是...
内类中,`synchronized`块的`this`则代表内类实例,如果需要同步外类的非静态方法,可以使用`OuterClass.this`: ```java public class Test { class InnerClass { public void method3() { synchronized (Test....
synchronized保证了被修饰的代码块或方法的三个特性:原子性、可见性和有序性。原子性确保代码块要么完整执行要么不执行,这避免了部分执行时的不一致问题。可见性保证了一个线程对共享变量的修改对其他线程是可见的...
- 如果一个线程在一个对象的`synchronized(this)`块中,其他线程仍然可以访问该对象的非`synchronized(this)`代码块。 - 对象锁仅适用于该对象的`synchronized`代码块,不影响其他线程对其他对象的访问。 以下是...
例如,在文档中提到的第一个示例中,`run()`方法被`synchronized`修饰,但由于`t1`和`t2`是基于不同对象`r1`和`r2`的线程,它们实际上访问的是不同的数据,因此`synchronized`在这个例子中没有起到同步的作用。...
- 如果一个线程正在访问对象的`synchronized(this)`同步代码块,其他线程仍然可以访问该对象的非`synchronized(this)`代码块。例如: ```java package ts; public class Thread2 { public void m4t1() { ...
通过`synchronized`关键字,开发者可以控制代码块或方法的并发访问,从而确保数据的一致性和程序的正确性。 #### 使用场景 1. **同步代码块**:可以通过`synchronized`关键字来声明同步代码块,即通过指定对象锁来...
在提供的示例中,`MyRunable`类的`run()`方法使用`synchronized(this)`代码块,这里的`this`指的是`MyRunable`对象。由于`t1`和`t2`都基于同一个`Runnable`对象`demo`创建,所以它们共享`demo`的锁。当一个线程执行`...
对于同步方法,静态方法的锁对象是类的`Class`对象,非静态方法的锁对象是`this`(当前实例)。 2. 同步操作的思考顺序 - 识别线程安全问题:首先确定哪部分代码是多线程运行的,然后判断是否存在共享数据,最后看...
在这个示例中,`Thread1`类实现了`Runnable`接口,并在`run`方法中定义了一个`synchronized(this)`代码块。当两个线程`A`和`B`分别启动时,它们都将尝试执行该同步代码块。根据`synchronized`的特性,一次只有一个...