синхронизированный перевод: (сделать) синхронизированный, согласованный во времени, с той же скоростью
Вопрос: зачем делать синхронизацию
Основная проблема заключается в том, что общие ресурсы (критические ресурсы) и многопоточная работа одного и того же ресурса вызывают несогласованность данных, поэтому требуется синхронизация потоков.
Принципиальный способ решения проблемы:
В то же время есть только один поток, работающий с общими данными, а другие потоки ожидают обработки потока, прежде чем работать с общим ресурсом.
Синхронизированная реализация должна вводить блокировки взаимного исключения, две характеристики блокировок взаимного исключения: взаимное исключение и видимость. Синхронизированные блокировки - это не код, а объекты.
По классификации приобретенных замков его можно разделить на объектные и классовые.
Два метода блокировки объекта:
1. Синхронизированный блок кода {synchronized (this), synchronized (объект-экземпляр класса), блокировка - объект-экземпляр в круглых скобках}
2. Синхронизированный нестатический метод {синхронизированный метод}, который блокирует текущий экземпляр;
Два метода блокировки класса:
1. Синхронизированный блок кода {synchronized (class.class), блокировка - это объект класса (объект класса) в круглых скобках ()}
2. Синхронизированный статический метод {синхронизированный статический метод}, который блокирует объект текущего класса (объект класса).
Не говорите глупостей о коде (блокировка класса также является специальной блокировкой объекта, выполнение блокировки класса и блокировки объекта не влияет друг на друга)
Всего существует два класса, один - это многопоточный метод SyncThread, содержащий 4 вида блокировок, а другой - вызывающий класс RunSyncDemo.
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Created by Administrator on 2019/11/16.
*/
public class SyncThread implements Runnable {
@Override
public void run() {
String threadName = Thread.currentThread().getName();
if(threadName.startsWith("A")){
sync();
}else if(threadName.startsWith("B")){
syncObject1();
}else if (threadName.startsWith("C")){
syncObject2();
}else if (threadName.startsWith("D")){
syncObject3();
}else if (threadName.startsWith("E")){
syncObject4();
}
}
/**
*
*/
private void sync(){
try {
System.out.println(Thread.currentThread().getName()+"_sync_Start:"+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+"_sync_end:"+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
*同步代码块{synchronized(this),synchronized(类的实例对象),锁的是小括号里面的实例对象}
*/
private void syncObject1(){
System.out.println(Thread.currentThread().getName()+"_syncObject1"+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
try {
synchronized (this) {
System.out.println(Thread.currentThread().getName() + "_syncObject1_Start:" + new SimpleDateFormat("HH:mm:ss").format(new Date()));
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + "_syncObject1_end:" + new SimpleDateFormat("HH:mm:ss").format(new Date()));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
*同步非静态方法{synchronized method},锁的是当前的实例;
*/
private synchronized void syncObject2(){
System.out.println(Thread.currentThread().getName()+"_syncObject2:"+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
try {
System.out.println(Thread.currentThread().getName()+"_syncObject2_Start:"+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+"_syncObject3_end:"+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
*同步代码块{synchronized(类.class),锁的是小括号()中的类对象(class对象)}
*/
private void syncObject3(){
System.out.println(Thread.currentThread().getName()+"_syncObject3"+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
try {
synchronized (SyncThread.class) {
System.out.println(Thread.currentThread().getName() + "_syncObject3_Start:" + new SimpleDateFormat("HH:mm:ss").format(new Date()));
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName() + "_syncObject3_end:" + new SimpleDateFormat("HH:mm:ss").format(new Date()));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
*同步静态方法{synchronized static method},锁的是当前类的对象(clas对象)
*/
private static synchronized void syncObject4(){
System.out.println(Thread.currentThread().getName()+"_syncObject3:"+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
try {
System.out.println(Thread.currentThread().getName()+"_syncObject4_Start:"+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+"_syncObject4_end:"+ new SimpleDateFormat("HH:mm:ss").format(new Date()));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class RunSyncDemo {
public static void main(String[] args) {
SyncThread syncThread =new SyncThread();
Thread thread1 = new Thread(syncThread,"A");
Thread thread2 = new Thread(syncThread,"A");
Thread thread3 = new Thread(syncThread,"B");
Thread thread4 = new Thread(syncThread,"B");
Thread thread5 = new Thread(syncThread,"C");
Thread thread6 = new Thread(syncThread,"C");
Thread thread7 = new Thread(syncThread,"D");
Thread thread8 = new Thread(syncThread,"D");
Thread thread9 = new Thread(syncThread,"E");
Thread thread10 = new Thread(syncThread,"E");
thread1.start();
thread2.start();
thread3.start();
thread4.start();
thread5.start();
thread6.start();
thread7.start();
thread8.start();
thread9.start();
thread10.start();
}
}
подводить итоги:
Блокировка объекта - это фрагмент кода, который выглядит как блокировка, а класс блокирует весь класс; если у вас есть какие-либо вопросы, оставьте сообщение для обсуждения.