Uso de sincronizado

Escenarios de uso de sincronizados

1. El método de sincronización de dos subprocesos que acceden al mismo objeto al mismo tiempo es seguro
2. El método de sincronización de dos subprocesos que acceden a dos objetos al mismo tiempo no es seguro test1.func1 () test2.func1 ()
3. Dos subprocesos acceder al mismo tiempo (uno o dos A) El método de sincronización estática del objeto es seguro
4. Dos subprocesos acceden simultáneamente (uno o dos) al método sincronizado y el método no sincronizado del objeto no son seguros
5. Dos subprocesos acceder al método sincronizado en el mismo objeto, y el método sincronizado se llama de nuevo Otro método no sincronizado no es seguro
6. Diferentes métodos de sincronización de dos subprocesos que acceden al mismo objeto al mismo tiempo son seguros
7. Dos subprocesos acceden simultáneamente sincronizados estáticos y los métodos sincronizados no estáticos no son seguros
8. Los métodos sincronizados arrojan excepciones, JVM liberará automáticamente el bloqueo

package thread;

import java.util.concurrent.TimeUnit;
public class TestDemo8 {
    
    
    public synchronized void fun1(){
    
    
        System.out.println(Thread.currentThread().getName()+":: 同步方法fun1开始");
        try {
    
    
            TimeUnit.MILLISECONDS.sleep(1000);
//        fun3();
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+":: 同步方法fun1结束");
    }

    public synchronized static void fun2() throws Exception {
    
    
        //类锁  class对象
        System.out.println(Thread.currentThread().getName()+":: 静态同步方法func2开始");
        try {
    
    
            TimeUnit.MILLISECONDS.sleep(1000);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+":: 静态同步方法func2结束");
    }

    public void fun3(){
    
    
        System.out.println(Thread.currentThread().getName()+":: 非同步方法func3");
        try {
    
    
            TimeUnit.MILLISECONDS.sleep(1000);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+":: 非同步方法func3");
    }

    public synchronized void fun4(){
    
    
        System.out.println(Thread.currentThread().getName()+":: 同步方法fun4开始");
        try {
    
    
            TimeUnit.MILLISECONDS.sleep(1000);
        } catch (InterruptedException e) {
    
    
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+":: 同步方法func4结束");
    }
    public static void main(String[] args) {
    
    
        TestDemo8 test1 = new TestDemo8();
        TestDemo8 test2 = new TestDemo8();
        new Thread("A"){
    
    
            @Override
            public void run() {
    
    
                test1.fun1();  //unlock
                test1.fun3();
            }
        }.start();

        new Thread("B"){
    
    
            @Override
            public void run() {
    
    
                test1.fun1(); //lock
                test1.fun3();
            }
        }.start();

//        Thread threadc = new Thread("C"){
    
    
//            @Override
//            public void run() {
    
    
//                test1.fun1();
//            }
//        };
//        threadc.start();
//        threadc.interrupt();
//
//        new Thread("D"){
    
    
//            @Override
//            public void run() {
    
    
//                test1.fun1();
//            }
//        }.start();
    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_41571459/article/details/113939216
Recomendado
Clasificación