Reasons for using synchronization
1. Multi-threads must be used to access classes in the system;
2. There are class variables in the class, or methods in the class There is access to public resources (such as reading and writing an external file).
What is the content locked by synchronization lock?
Whether you add Synchronized before a method or a variable, it locks a class object. Each object has only one lock associated with it.
The following example lists the synchronization effects in various situations
1. Synchronized is added to the method, (synchronization method, lock class instance)
Java code
public class Demo1 { public synchronized void m1(){ //............... } public void m2(){ //............ synchronized(this){ //......... } //........ } }
The effect of these two writing methods is the same, and they lock all class instance objects. If there is a class instance object: demo = new Demo1(), and there are two threads: thread1, thread2, both calling the demo object, then, at the same time, if thread1 calls demo.m1(), then thread2 is in the demo.m1() and demo.m2() cannot be accessed within the time; because thread1 uses the lock of the demo object, it cannot be distributed to other threads for use
However, if thread1 calls demo1.m1() , thread2 can call demo2.m1() at the same time, because they call different Demo1 class object instances.
2. Synchronized is added to the variable, (synchronized block, lock class instance)
Java code
public class Demo2 { Object a = new Object(); Object b = new Object(); public void m1(){ //............ synchronized(a){ //......... } //........ } public void m2(){ //............ synchronized(b){ //......... } //........ } }
In this case, it is implemented Code block locking, the locked object is variable a or b; (note that a and b are non-static) If there is a class instance object: demo = new Demo2(), and there are two other threads: thread1, thread2, both are called demo object, then, at the same time, if thread1 calls demo.m1(), thread2 can access demo.m2() within that time; but cannot access the synchronization block of demo.m1(), because a is blocked by thread1 Locked.
3. Synchronized locks class variables, that is, static variables (may be attributes, may be methods) (locking class objects)
Java code
public class Demo3 { static Object o = new Object(); public static synchronized void m1() { //.... } public static void m2() { //... synchronized (Demo3.class) { //..... } //..... } public static void m3() { //.......... try { synchronized (Class.forName("Demo3")) { //............ } } catch (ClassNotFoundException ex) { } //............. } public static void m4() { //............ synchronized(o){ //........ } //.......... } }
The effects achieved in the above four methods are the same. The locked objects are all class Demo3, not class instance objects. That is, in multi-threads, the shared resources belong to the class, not the class. object. In this case, if thread1 accesses any of these four methods, no other thread can access these four methods at the same time.
4. The class method accesses a resource common to multiple threads, and the resource is variable. In this case, synchronization is also required
Java code
public class Demo4 { static String path = "file path"; public void readConfiFile() { synchronized (path) { // 读取该path指定的文件。 } } public void writeConfiFile() { synchronized (path) { //写信息到该path指定的文件。 } } }
In this case, it must be locked as a class variable instead of a class instance object, because this is a kind of class resource sharing of variable image, not class instance object resource sharing.
Threads have their successes and failures. If they are used well, they can improve performance. If they are not used well, they will cause endless troubles for the system.
PS: Thread synchronization requires a lot of system overhead, so when using it, if it is not necessary, try not to use the synchronization function.
The above is the detailed content of How Java uses Synchronized to achieve multi-thread synchronization. For more information, please follow other related articles on the PHP Chinese website!

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于结构化数据处理开源库SPL的相关问题,下面就一起来看一下java下理想的结构化数据处理类库,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于PriorityQueue优先级队列的相关知识,Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于java锁的相关问题,包括了独占锁、悲观锁、乐观锁、共享锁等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于多线程的相关问题,包括了线程安装、线程加锁与线程不安全的原因、线程安全的标准类等等内容,希望对大家有帮助。

本篇文章给大家带来了关于Java的相关知识,其中主要介绍了关于关键字中this和super的相关问题,以及他们的一些区别,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于枚举的相关问题,包括了枚举的基本操作、集合类对枚举的支持等等内容,下面一起来看一下,希望对大家有帮助。

封装是一种信息隐藏技术,是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法;封装可以被认为是一个保护屏障,防止指定类的代码和数据被外部类定义的代码随机访问。封装可以通过关键字private,protected和public实现。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于设计模式的相关问题,主要将装饰器模式的相关内容,指在不改变现有对象结构的情况下,动态地给该对象增加一些职责的模式,希望对大家有帮助。


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

WebStorm Mac version
Useful JavaScript development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

SublimeText3 Chinese version
Chinese version, very easy to use

Safe Exam Browser
Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

Dreamweaver Mac version
Visual web development tools
