synchronize - dz̸

匿名 (未验证) 提交于 2019-12-02 23:34:01

一、基本介绍:

关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法(或者该类的其他同步方法),有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,锁定调用者,然后直接运行。它包括两种用法:synchronized 方法和 synchronized 块。

二、synchronized实现原理

在java代码中使用synchronized可是使用在代码块和方法中,根据Synchronized用的位置可以有这些使用场景:

还有比较详细的说明,请看文章:https://www.jianshu.com/p/d53bf830fa09

举个简单例子

package com.youyou.ch1.syn;public class SynClzAndInst {    //使用类锁的线程    private static class SynClass extends Thread{        @Override        public void run() {            System.out.println("TestClass is running...");            synClass();        }    }    //使用对象锁的线程    private static class InstanceSyn implements Runnable{        private SynClzAndInst synClzAndInst;        public InstanceSyn(SynClzAndInst synClzAndInst) {            this.synClzAndInst = synClzAndInst;        }        @Override        public void run() {            System.out.println("TestInstance is running..."+synClzAndInst);            synClzAndInst.instance();        }    }    //使用对象锁的线程    private static class Instance2Syn implements Runnable{        private SynClzAndInst synClzAndInst;        public Instance2Syn(SynClzAndInst synClzAndInst){            this.synClzAndInst = synClzAndInst;        }        @Override        public void run() {            System.out.println("TestInstance2 is running..."+synClzAndInst);            synClzAndInst.instance2();        }    }    //锁对象    private synchronized void instance(){        try {            Thread.sleep(3000);            System.out.println("synInstance is going..."+this.toString());            Thread.sleep(3000);            System.out.println("synInstance ended "+this.toString());        } catch (InterruptedException e) {            e.printStackTrace();        }    }    //锁对象    private synchronized void instance2(){        try {            Thread.sleep(3000);            System.out.println("synInstance1 is going..."+this.toString());            Thread.sleep(3000);            System.out.println("synInstance1  ended "+this.toString());        } catch (InterruptedException e) {            e.printStackTrace();        }    }    //类锁,实际是锁类的class对象    private static synchronized void  synClass() {        try {            Thread.sleep(1000);            System.out.println("synClass going...");            Thread.sleep(1000);            System.out.println("synClass end");        } catch (InterruptedException e) {            e.printStackTrace();        }    }    public static void main(String[] args) {        SynClzAndInst synClzAndInst = new SynClzAndInst();        Thread t1 = new Thread(new InstanceSyn(synClzAndInst));        SynClzAndInst synClzAndInst2 = new SynClzAndInst();        Thread t2 = new Thread(new Instance2Syn(synClzAndInst));        t1.start();        t2.start();       // SynClass synClass = new SynClass();        //synClass.start();        //SleepTools.second(1);    }}

  

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!