首页 > 其他 > 详细

synchronize - 浅谈

时间:2019-05-22 00:27:07      阅读:121      评论:0      收藏:0      [点我收藏+]

一、基本介绍:

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

  

 

synchronize - 浅谈

原文:https://www.cnblogs.com/lys-lyy/p/10903268.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!