Bloque de código sincronizado y método de sincronización de sincronizado

1. La palabra clave de sincronización sincronizada
aquí involucra múltiples subprocesos para procesar recursos compartidos, aquí es necesario "poner en cola" los subprocesos, la palabra clave utilizada es sincronizada (sincronización), en el programa, al código para procesar recursos compartidos Agregue esta palabra clave al part (el método completo o bloque de código). Es equivalente a bloquear el bloque de código, el subproceso que obtiene la clave opera en el recurso y entrega la clave a otros subprocesos una vez finalizado, lo que garantiza que solo un subproceso pueda modificar el mismo recurso en un momento determinado.

Bloque de código de sincronización

synchronized(lock){
    
    
操作共享资源代码块
}

lock es un objeto de bloqueo, es la clave del bloque de código de sincronización. Cuando un subproceso ejecuta un bloque de código de sincronización, primero verifica el bit de bandera del objeto de bloqueo. De forma predeterminada, el bit de bandera es 1. En este momento, el subproceso ejecuta el bloque de código de sincronización y establece la posición de la bandera del objeto de bloqueo en 0. Cuando se ejecuta un nuevo subproceso Cuando se alcanza este bloque de código de sincronización, debido a que el bit de bandera del objeto de bloqueo es 0, el nuevo subproceso se bloqueará. Una vez que el subproceso actual termina de ejecutar el bloque de código de sincronización, el bit de bandera del bloqueo el objeto se establece en 1, y el nuevo hilo puede entrar en el bloque de código de sincronización Ejecutar el código en él. Repetidamente hasta que se procesen los recursos compartidos. Este proceso es como una cabina telefónica pública: solo la persona que está detrás puede hacer la llamada después de que la persona que está delante sale.

Nota:

  1. El objeto de bloqueo en el bloque de código de sincronización puede ser cualquier tipo de objeto, pero el objeto de bloqueo compartido por varios subprocesos debe ser único. "Cualquiera" se refiere al tipo de objeto de bloqueo compartido. Por lo tanto, el código de creación del objeto de bloqueo no se puede colocar en el método run (); de lo contrario, cada subproceso creará un nuevo objeto cuando se ejecute en el método run (), de modo que cada subproceso tendrá un bloqueo diferente y cada bloqueo tiene su propio bit de bandera. No hay efecto de sincronización entre hilos.
public void run(){
    
     
   Object lock = new Object(); 
    //代码 
    synchronized(lock){
    
    //锁失去了意义 
         //对共享资源处理代码 
    } 
    //代码 
} 
  1. Preste atención a la cerradura de subdivisión. Puede haber varios objetos de bloqueo para "bloquear" diferentes recursos
class A{
    
     
     private Object lock1 = new Object(); 
     private Object lock2 = new Object(); 
     
     void f(){
    
     
           synchronized(lock1){
    
     
                 //访问资源P 
           } 
     } 

     void g(){
    
     
           synchronized(lock2){
    
     
                 //访问资源Q 
           } 
     } 
} 

A continuación, se muestra un ejemplo de cómo comprar un boleto:

//定义Ticket1类继承Runnable接口
class Ticket1 implements Runnable {
    
    
	private int tickets = 10; // 定义变量tickets,并赋值10
	**Object lock = new Object(); // 定义任意一个对象,用作同步代码块的锁**
	public void run() {
    
    
		while (true) {
    
    
			**synchronized (lock) {
    
     // 定义同步代码块**
				try {
    
    
					Thread.sleep(10); // 经过的线程休眠10毫秒
				} catch (InterruptedException e) {
    
    
					e.printStackTrace();
				}
				if (tickets > 0) {
    
    
					System.out.println(Thread.currentThread().getName()
							+ "---卖出的票" + tickets--);
				} else {
    
     // 如果 tickets小于0,跳出循环
					break;
				}
			}
		}
	}
}
public class Example {
    
    
	public static void main(String[] args) {
    
    
		Ticket1 ticket = new Ticket1(); // 创建Ticket1对象
		// 创建并开启四个线程
		new Thread(ticket, "线程一").start();
		new Thread(ticket, "线程二").start();
		new Thread(ticket, "线程三").start();
		new Thread(ticket, "线程四").start();
	}
}

resultado de la operación:

Método de sincronización

Formato: tipo de valor de retorno sincronizado nombre del método ([parámetro 1,…]) {}
El método modificado por sincronizado permite que solo un subproceso acceda en un momento determinado, y otros subprocesos que accedan al método se bloquearán hasta que se complete el acceso al subproceso actual , Solo otros subprocesos tienen la oportunidad de ejecutar el método.

// 定义Ticket1类实现Runnable接口
class Ticket1 implements Runnable {
    
    
	private int tickets = 10;
	public void run() {
    
    
		while (true) {
    
    
			saleTicket(); // 调用售票方法
			if (tickets <= 0) {
    
     
				break;
			}
		}
	}
    // 定义一个同步方法saleTicket()
	private synchronized void saleTicket() {
    
    
		if (tickets > 0) {
    
    
			try {
    
    
				Thread.sleep(10); // 经过的线程休眠10毫秒
			} catch (InterruptedException e) {
    
    
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName() + "---卖出的票"
					+ tickets--);
		}
	}
}
public class Example {
    
    
	public static void main(String[] args) {
    
    
		Ticket1 ticket = new Ticket1(); // 创建Ticket1对象
         // 创建并开启四个线程
		new Thread(ticket,"线程一").start();
		new Thread(ticket,"线程二").start();
		new Thread(ticket,"线程三").start();
		new Thread(ticket,"线程四").start();
	}
}


Supongo que te gusta

Origin blog.csdn.net/xun08042/article/details/113844343
Recomendado
Clasificación