zoukankan      html  css  js  c++  java
  • synchronize

    一、基本介绍:

    synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程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);
    }
    }

      

  • 相关阅读:
    PAT1037:Magic Coupon
    PAT1081:Rational Sum
    PAT1039: Course List for Student
    PAT1069:The Black Hole of Numbers
    VC++中字符串编码处理的一些相关问题
    PAT1110:Complete Binary Tree
    Java编译器003---javac -d/-sourcepath/-classpath选项
    Java编译器002---javac -source/-target选项
    Java编译器001---javac -g选项
    力扣练习010---把字符串转换成整数
  • 原文地址:https://www.cnblogs.com/lys-lyy/p/10903268.html
Copyright © 2011-2022 走看看