• 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);
    }
    }

      

  • 相关阅读:
    CentOS7 安装MongoDB 3.0服务
    PXE批量部署linux操作系统
    centos的软件安装方法rpm和yum
    第二章:Posix IPC
    第一章:简介
    Unix网络编程--卷二:进程间通信
    Unix网络编程--卷二:FAQ
    linux下samba环境搭建
    Linux下缓冲区溢出攻击的原理及对策(转载)
    lsof
  • 原文地址:https://www.cnblogs.com/lys-lyy/p/10903268.html
Copyright © 2020-2023  润新知