synchronized 锁机制简单的用法,高效的执行效率使成为解决线程安全的首选。 下面总结其特性以及使用技巧,加深对其理解。

特性:

  1. Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。

      2. 当一个线程同时访问object的一个synchronized(this)同步代码块时,其它线程仍然可以访问非修饰的方法或代码块。

      3. 当多个线程同时访问object的synchronized(this)同步代码块时,会存在互斥访问,其它线程会阻塞直到获取锁。

      4. 当线程访问object的synchronized(this)同步代码块时,同一个线程可以多次获取锁,当然也不需要释放多次。获取和释放必须相同。

      5. 所有的对象都可以获取锁,也可以释放锁。

      6. 所有的类也可以获取锁和释放锁,因此静态方法也可以加锁。而特性同上。

猜想:

     在jvm中对每个对象都有一个记录锁的状态,当同一个线程访问锁时候就会累加,其它线程访问要等到状态变为未锁状态,当让相同线程释放锁会累减。

 质疑:

    那么对于类锁来说,应该是所有对象都可以获取锁,那么锁是全局的对所有对象都有效?

public class SynchronizedMtdTest {

  public static void main(String[] args) {

    new Thread(new Runnable() {
@Override
public void run() {
SynchronizedMtdTest.appendStr();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
SynchronizedMtdTest.printStr();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
SynchronizedMtdTest synchronizedMtdTest = new SynchronizedMtdTest();
synchronizedMtdTest.appendStr();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
SynchronizedMtdTest synchronizedMtdTest = new SynchronizedMtdTest();
synchronizedMtdTest.printStr();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
SynchronizedMtdTest synchronizedMtdTest = new SynchronizedMtdTest();
synchronizedMtdTest.append();
}
}).start();
} public synchronized static void appendStr() {
System.out.println("pid=" + Thread.currentThread().getId() + "------appendStr------");
try {
Thread.sleep(1000);
System.out.println("pid=" + Thread.currentThread().getId() + "------appendStr1000------");
} catch (InterruptedException e) {
e.printStackTrace();
} } public static void append() {
System.out.println("pid=" + Thread.currentThread().getId() + "------append------");
try {
Thread.sleep(3000);
System.out.println("pid=" + Thread.currentThread().getId() + "------append3000------");
} catch (InterruptedException e) {
e.printStackTrace();
} } public synchronized static void printStr() {
System.out.println("pid=" + Thread.currentThread().getId() + "------printStr------");
try {
Thread.sleep(6000);
System.out.println("pid=" + Thread.currentThread().getId() + "------printStr6000------");
} catch (InterruptedException e) {
e.printStackTrace();
}
} }

结果:

pid=10------appendStr------
pid=14------append------
pid=10------appendStr1000------
pid=13------printStr------
pid=14------append3000------
pid=13------printStr6000------
pid=12------appendStr------
pid=12------appendStr1000------
pid=11------printStr------
pid=11------printStr6000------

分析结果可以看出对于静态方法加锁,所有的线程调用方法,不管怎样都会互斥,而为加锁不会互斥。

因此:

对于类锁来说应该在持久代也就是方法区有对具体类也有加锁机制,而且原理同对象锁。

那么:

    可见,上面可以做如下修改达到相同效果。

public static void appendStr() {
synchronized (SynchronizedMtdTest.class) {
System.out.println("pid=" + Thread.currentThread().getId() + "------appendStr------");
try {
Thread.sleep(1000);
System.out.println("pid=" + Thread.currentThread().getId() + "------appendStr1000------");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public static void printStr() {
synchronized (SynchronizedMtdTest.class) {
System.out.println("pid=" + Thread.currentThread().getId() + "------printStr------");
try {
Thread.sleep(6000);
System.out.println("pid=" + Thread.currentThread().getId() + "------printStr6000------");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

结果:

pid=10------appendStr------
pid=10------appendStr1000------
pid=13------printStr------
pid=13------printStr6000------
pid=12------appendStr------
pid=12------appendStr1000------
pid=11------printStr------
pid=11------printStr6000------

JAVA synchronized关键字锁机制(中)的更多相关文章

  1. 由Java 15废弃偏向锁,谈谈Java Synchronized 的锁机制

    Java 15 废弃偏向锁 JDK 15已经在2020年9月15日发布,详情见 JDK 15 官方计划.其中有一项更新是废弃偏向锁,官方的详细说明在:JEP 374: Disable and Depr ...

  2. Java Synchronized 关键字

    本文内容 Synchronized 关键字 示例 Synchronized 方法 内部锁(Intrinsic Locks)和 Synchronization 参考资料 下载 Demo Synchron ...

  3. Java synchronized 关键字详解

    Java synchronized 关键字详解 前置技能点 进程和线程的概念 线程创建方式 线程的状态状态转换 线程安全的概念 synchronized 关键字的几种用法 修饰非静态成员方法 sync ...

  4. JAVA多线程与锁机制

    JAVA多线程与锁机制 1 关于Synchronized和lock synchronized是Java的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码 ...

  5. 深入浅出Java并发包—锁机制(三)

    接上文<深入浅出Java并发包—锁机制(二)>  由锁衍生的下一个对象是条件变量,这个对象的存在很大程度上是为了解决Object.wait/notify/notifyAll难以使用的问题. ...

  6. 深入浅出Java并发包—锁机制(二)

    接上文<深入浅出Java并发包—锁机制(一)  >  2.Sync.FairSync.TryAcquire(公平锁) 我们直接来看代码 protected final boolean tr ...

  7. java并发之线程同步(synchronized和锁机制)

    使用synchronized实现同步方法 使用非依赖属性实现同步 在同步块中使用条件(wait(),notify(),notifyAll()) 使用锁实现同步 使用读写锁实现同步数据访问 修改锁的公平 ...

  8. [多线程] 线程中的synchronized关键字锁

    为什么要用锁? 在多线程中,难免会出现在多个线程中对同一个对象的实例变量或者全局静态变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数据其实 ...

  9. Java:synchronized关键字引出的多种锁

    前言 Java 中的 synchronized关键字可以在多线程环境下用来作为线程安全的同步锁.本文不讨论 synchronized 的具体使用,而是研究下synchronized底层的锁机制,以及这 ...

随机推荐

  1. scikit_learn 中文说明入门

    原文:http://www.cnblogs.com/taceywong/p/4568806.html 原文地址:http://scikit-learn.org/stable/tutorial/basi ...

  2. [面经] 南京SAP面试(下)

    上一篇讲到了一面结束,这一篇说说剩下的事情. 周三上午一面完了之后回去上班,本以为要等几天才会二面,结果那个经理M下午就打电话给我,约了第二天(周四)下午过去面试,会有Boss从上海过来面,办事效率还 ...

  3. 【数组】—冒泡排序&&选择排序---【巷子】

    /* 什么是冒泡排序:从头到尾比较相邻的两个数的大小,如果符合条件则进行比较 [注]:从小到大进行排序 假设有一个数组 var arr = [9,8,7,6,5,4]; 我们想要进行这个数组进行排序那 ...

  4. spring boot tomcat 线程数 修改初始线程数 统计性能 每百次请求耗时

    [root@f java]# tail -30 nohup.outsearchES-TimeMillisSpent:448P->1602@fT->http-nio-8080-exec-3t ...

  5. Django - Ajax - 参数

    一.Jquery实现Ajax url   type   data   success   error  complete  statusCode {% load staticfiles %} < ...

  6. 解决Android中ListView列表只显示一项数据的问题

    思路:获取每项item的高度,并相加,再加上分割线的高度,作为整个ListView的高度,方法如下: public static void setListViewHeightBasedOnChildr ...

  7. Python知识总汇

    一.python基础 python基础 python编码问题 逻辑运算 二.python数据类型 二.python数据类型 三.IO(文件处理) 三.IO(文件处理) 四.函数 函数基础 名称空间与作 ...

  8. iis启动&nbsp;服务无法在此时接受控制信息。&nbsp;(异常来自&nbsp;HRESULT:0x80070425)

    问题描述:每隔一段时间应用程序池就会自动停止,报错:服务无法在此时接受控制信息.(异常来自 HRESULT:0x80070425)   iis启动 服务无法在此时接受控制信息. (异常来自HRESUL ...

  9. python高级之scrapy框架

    目录: 爬虫性能原理 scrapy框架解析 一.爬虫性能原理 在编写爬虫时,性能的消耗主要在IO请求中,当单进程单线程模式下请求URL时必然会引起等待,从而使得请求整体变慢. 1.同步执行 impor ...

  10. spring boot security 登出

    <!DOCTYPE html> <html lang="zh-cn" xmlns:th="http://www.thymeleaf.org" ...