Thread's guardian thread y problemas de seguridad de subprocesos

Hilo de demonio

Inserte la descripción de la imagen aquí


package com.hanyxx.thread;
import lombok.SneakyThrows;

/**
 * @author layman
 * @date 2021/2/5
 */
public class ThreadDaemon04 {
    
    
    public static void main(String[] args) throws InterruptedException {
    
    
        demo04 demo04 = new demo04();
        //当把demo04设置为守护线程时,主线程结束时,demo04就会结束。
        demo04.setDaemon(true);
        demo04.start();
        Thread.sleep(2000);
        System.out.println("main线程结束");
    }
}
class demo04 extends  Thread{
    
    
    @SneakyThrows
    @Override
    public void run() {
    
    
        while(true){
    
    
            System.out.println("time= "+System.currentTimeMillis());
            Thread.sleep(500);
        }
    }
}

A salvo de amenazas

Inserte la descripción de la imagen aquí

Verificar la seguridad de los subprocesos de las variables locales

package com.hanyxx.thread;

import lombok.SneakyThrows;

/**
 * @author layman
 * @date 2021/2/5
 */
public class Demo05 {
    
    
    public static void main(String[] args) {
    
    
        Demo05Service service = new Demo05Service();
        Demo05ThreadA threadA = new Demo05ThreadA(service);
        threadA.start();
        Demo05ThreadB threadB = new Demo05ThreadB(service);
        threadB.start();
    }
}
class Demo05Service{
    
    
    @SneakyThrows
    public void changeNum(String username){
    
    
        int number;
        if("layman".equals(username)){
    
    
            number = 100;
            //线程睡眠,让后续线程可以修改number的值
            Thread.sleep(2000);
        }else{
    
    
            number = 200;
        }
        System.out.println("username: ["+username+"] number: ["+number+"]");
    }
}
class Demo05ThreadA extends  Thread{
    
    
    private Demo05Service service;
    public Demo05ThreadA(Demo05Service service){
    
    
        this.service = service;
    }
    @SneakyThrows
    @Override
    public void run() {
    
    
        while (true) {
    
    
            Thread.sleep(1000);
            service.changeNum("layman");
        }
    }
}
class Demo05ThreadB extends  Thread{
    
    
    private Demo05Service service;
    public Demo05ThreadB(Demo05Service service){
    
    
        this.service = service;
    }
    @SneakyThrows
    @Override
    public void run() {
    
    
        while (true) {
    
    
            Thread.sleep(1000);
            service.changeNum("菠菜饭团");
        }
    }
}

Verifique que las variables miembro no sean seguras para subprocesos

package com.hanyxx.thread;

import lombok.SneakyThrows;

/**
 * @author layman
 * @date 2021/2/5
 */
public class Demo05 {
    
    
    public static void main(String[] args) {
    
    
        Demo05Service service = new Demo05Service();
        Demo05ThreadA threadA = new Demo05ThreadA(service);
        threadA.start();
        Demo05ThreadB threadB = new Demo05ThreadB(service);
        threadB.start();
    }
}
class Demo05Service{
    
    
    int number;
    @SneakyThrows
    public void changeNum(String username){
    
    
        if("layman".equals(username)){
    
    
            number = 100;
            //线程睡眠,让后续线程可以修改number的值
            Thread.sleep(2000);
        }else{
    
    
            number = 200;
        }
        System.out.println("username: ["+username+"] number: ["+number+"]");
    }
}
class Demo05ThreadA extends  Thread{
    
    
    private Demo05Service service;
    public Demo05ThreadA(Demo05Service service){
    
    
        this.service = service;
    }
    @SneakyThrows
    @Override
    public void run() {
    
    
        while (true) {
    
    
            Thread.sleep(1000);
            service.changeNum("layman");
        }
    }
}
class Demo05ThreadB extends  Thread{
    
    
    private Demo05Service service;
    public Demo05ThreadB(Demo05Service service){
    
    
        this.service = service;
    }
    @SneakyThrows
    @Override
    public void run() {
    
    
        while (true) {
    
    
            Thread.sleep(1000);
            service.changeNum("菠菜饭团");
        }
    }
}

En conclusión:

  • Las variables locales son privadas dentro del método. Esto significa que siempre es seguro para subprocesos.
  • Las variables miembro son propiedad de la clase, no son seguras para subprocesos.
    Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/single_0910/article/details/113698709
Recomendado
Clasificación