synchronized 基本用法

Posted lwdmaib

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了synchronized 基本用法相关的知识,希望对你有一定的参考价值。

常见三种使用方式

1)普通同步方法,锁是当前实例;
2)静态同步方法,锁是当前类的Class实例,Class数据存在永久代中,是该类的一个全局锁;
3)对于同步代码块,锁是synchronized括号里配置的对象。

 

方式一   普通方法通过synchronized修饰

   1)不采用synchronized     当创建两个线程对象  线程t1  t2中采用同一个实例化类对象  调用method方法  会交异步执行  互补影响

技术分享图片
package cn.ac.bcc.sync;
/**
 * 普通同步方法通过synchronized修饰
 * @author Administrator
 *
 */
public class PtMethod {
    
    /**
     * 1)不采用synchronized修饰
     * @param s
     */
    public  void method(String s){
        if(s.equals("a")){
            System.out.println(Thread.currentThread().getName()+": a");
            
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }else{
            System.out.println(Thread.currentThread().getName()+": b");
        }
    }
    
    public static void main(String[] args) {
        //创建当前类对象实例
        final PtMethod ptMethod = new PtMethod();
        
        //创建线程
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                ptMethod.method("a");
            }
        });
        
        Thread t2 = new Thread(new Runnable(){
            @Override
            public void run() {
                // TODO Auto-generated method stub
                ptMethod.method("b");
            }
            
        });
        
        t1.start();
        t2.start();
    }

}
View Code

 运行结果:

Thread-1: b
Thread-0: a

 2)采用synchronized   当创建两个线程对象  线程t1 t2 中采用同一个实例化对象  调用synchronized修饰的method方法  method方法中线程睡眠一秒钟  当线程t1优先抢占到method方法的执行权时由于method方法被synchronized修饰  method方法被实例化对象ptMethod对象锁锁住   当t2线程同样是ptMethod实例化对象调用当前method方法 由于两个线程t1 t2 都采用的是同一个实例化对象ptMethod 对象锁 只有t1运行完成后  t2中线程中的ptMethod对象才能调用method方法。由于method中获取当前调用线程睡眠  t2要等t1中调用的method睡眠唤醒之后执行完方法才能执行。

技术分享图片
public class PtMethod {
    
    /**
     * 1)采用synchronized修饰
     * @param s
     */
    public synchronized  void method(String s){
        if(s.equals("a")){
            System.out.println(Thread.currentThread().getName()+": a");
            
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }else{
            System.out.println(Thread.currentThread().getName()+": b");
        }
    }
    
    public static void main(String[] args) {
        //创建当前类对象实例
        final PtMethod ptMethod = new PtMethod();
        
        //创建线程
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                ptMethod.method("a");
            }
        });
        
        Thread t2 = new Thread(new Runnable(){
            @Override
            public void run() {
                // TODO Auto-generated method stub
                ptMethod.method("b");
            }
            
        });
        
        t1.start();
        t2.start();
    }

}
View Code

 3)采用synchronized修饰

技术分享图片
public class PtMethod {
    
    /**
     * 1)采用synchronized修饰
     * @param s
     */
    public synchronized  void method(String s){
        if(s.equals("a")){
            System.out.println(Thread.currentThread().getName()+": a");
            
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }else{
            System.out.println(Thread.currentThread().getName()+": b");
        }
    }
    
    public static void main(String[] args) {
        //创建当前类对象实例
        final PtMethod ptMethod1 = new PtMethod();
        final PtMethod ptMethod2 = new PtMethod();
        
        //创建线程
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                ptMethod1.method("a");
            }
        });
        
        Thread t2 = new Thread(new Runnable(){
            @Override
            public void run() {
                // TODO Auto-generated method stub
                ptMethod2.method("b");
            }
            
        });
        
        t1.start();
        t2.start();
    }

}
View Code

 




以上是关于synchronized 基本用法的主要内容,如果未能解决你的问题,请参考以下文章

Java中的Synchronized关键字用法

巨人大哥谈Java中的Synchronized关键字用法

面试必问的Synchronized知道这些就可以了

synchronized的用法

内置锁synchronized 介绍与用法

从三个层面解析synchronized原理