方法同步的弊端

方法同步的时候,如果一个方法需要线程安全控制的代码速度其实很快,但是有其他的业务逻辑代码耗时非常长(比如网络请求),这样所有的线程就在这一块就等待着了,这样造成了极大的资源浪费如果并发量很大,可能会造成系统崩溃。(并发的线程遇到synchronized同步的方法,变成串行....)

并发访问-代码块同步

语法:

synchronized (要锁住的对象) {
  并发执行且不耗时的业务计算代码;
}
 
代码示例: 方法同步比代码块同步耗时天壤地别
import java.util.HashSet;
import java.util.Set; /**
* @ClassName ThreadSyncCode
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/22.
*/
public class ThreadSyncCode {
//子线程类外公共用来计算的变量
private static int num = 0;
//子线程对象
private static class MyRannable implements Runnable {
@Override
public void run() { //这里synchronized 导致耗时的IO操作也变为串行
/**
* 模拟网络IO,磁盘IO耗时等待操作
*/
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
/**
* 避免多线程同时计算的代码块改为同步代码块。变为多线程到此串行执行;上面的IO耗时操作仍然并行
*/
synchronized (getClass()){
for (int i=0; i<1000; i++){
num++;
}
}
System.out.println(Thread.currentThread().getName() + " num result:" + num);
}
}
public static void main(String[] args) {
Set<Thread> threads = new HashSet<>();
MyRannable myRannable = new MyRannable();
for (int i=0; i<5; i++){
threads.add(new Thread(myRannable,"线程"+i));
}
threads.forEach(thread -> thread.start()); try {
Thread.sleep(6000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("main num result:" + num);
} }

方法同步IO耗时串行导致长达5S出结果。而代码块同步耗时1S多结束。

String作为被锁的对象

import java.util.HashSet;
import java.util.Set; /**
* @ClassName ThreadMultiObjectSyncStringLock
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/4/22.
*/
public class ThreadMultiObjectSyncStringLock {
private static int num = 0;
private static class MyThread extends Thread{
private String lock; public MyThread(String name, String lock) {
super(name);
this.lock = lock;
} @Override
public void run() {
synchronized (lock){
for (int i=0; i<1000; i++){
num++;
}
System.out.println(Thread.currentThread().getName() + " num:" + num);
}
}
}
public static void main(String[] args) {
//String锁对象
String lock = "LOCK";
//存放线程的集合
Set<MyThread> myThreads = new HashSet<>();
//向集合添加线程实例
for (int i=0; i<5; i++){
myThreads.add(new MyThread("T" +i, lock));
}
//启动所有线程
myThreads.forEach(myThread -> myThread.start());
//稍等时间主线程查看结果
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "num Result:" + num); //5000完全正确
}
}
结果:最终打印出来的num的值就是5000,结果是正确的。但是我们发现我们在for循环创建我们的线程的时候,我们定义了5次lock,但是实际上这些lock是同一个对象(指向的是同一个内存地址),因为在JAVA中,字符串具有常量缓存的功能。所以会被锁起来。

java 多线程: Thread 并发访问-代码块同步synchronized {};String作为被锁的对象的更多相关文章

  1. “全栈2019”Java多线程第十六章:同步synchronized关键字详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  2. java 多线程:Thread 并发线程: 方法同步synchronized关键字,与static的结合

    1.方法内的变量是安全的 方法内定义的变量,每个变量对应单独的内存变量地址,多个线程之间相互不影响.多个线程之间的变量根本没有一毛钱关系 public class ThreadFuncVarSafe ...

  3. Java多线程和并发(八),synchronized底层原理

    目录 1.对象头(Mark Word) 2.对象自带的锁(Monitor) 3.自旋锁和自适应自旋锁 4.偏向锁 5.轻量级锁 6.偏向锁,轻量级锁,重量级锁联系 八.synchronized底层原理 ...

  4. Java多线程和并发(七),synchronized

    目录 1.线程安全的主要原因 2.互斥锁的特性 3.锁的类别 4.类锁和对象锁的总结 七.synchronized 1.线程安全的主要原因 2.互斥锁的特性 Java中synchronized锁的不是 ...

  5. Java多线程与并发库高级应用-同步集合

    ArrayBlockingQueue LinkedBlockingQueue 数组是连续的一片内存 链表是不连续的一片内存  传统方式下用Collections工具类提供的synchronizedCo ...

  6. 对象及变量的并发访问(同步方法、同步代码块、对class进行加锁、线程死锁)&内部类的基本用法

    主要学习多线程的并发访问,也就是使得线程安全. 同步的单词为synchronized,异步的单词为asynchronized 同步主要就是通过锁的方式实现,一种就是隐式锁,另一种是显示锁Lock,本节 ...

  7. java多线程中并发集合和同步集合有哪些?区别是什么?

    java多线程中并发集合和同步集合有哪些? hashmap 是非同步的,故在多线程中是线程不安全的,不过也可以使用 同步类来进行包装: 包装类Collections.synchronizedMap() ...

  8. Java 多线程高并发编程 笔记(一)

    本篇文章主要是总结Java多线程/高并发编程的知识点,由浅入深,仅作自己的学习笔记,部分侵删. 一 . 基础知识点 1. 进程于线程的概念 2.线程创建的两种方式 注:public void run( ...

  9. Java 多线程基础(五)线程同步

    Java 多线程基础(五)线程同步 当我们使用多个线程访问同一资源的时候,且多个线程中对资源有写的操作,就容易出现线程安全问题. 要解决上述多线程并发访问一个资源的安全性问题,Java中提供了同步机制 ...

随机推荐

  1. maven项目打包不带版本号的操作

  2. 群晖ping自动关机

    因为学校宿舍环境的原因,每天早上10点左右宿管可能会来检查内务情况,然后一定会关闭电闸,就导致如果我的nas在10点半时开机的话用的是UPS的电源,直接导致UPS电量耗竭,而我又不可能一直去观察宿舍有 ...

  3. 洛谷 P5279 - [ZJOI2019]麻将(dp 套 dp)

    洛谷题面传送门 一道 dp 套 dp 的 immortal tea 首先考虑如何判断一套牌是否已经胡牌了,考虑 \(dp\)​​​​​.我们考虑将所有牌按权值大小从大到小排成一列,那我们设 \(dp_ ...

  4. Atcoder Grand Contest 038 E - Gachapon(Min-Max 容斥+背包)

    Atcoder 题面传送门 & 洛谷题面传送门 我竟然能独立做出 Ag 的 AGC E,incredible!更新了 Atcoder 做题难度上限( 首先按照套路 Min-Max 容斥,\(a ...

  5. DirectX12 3D 游戏开发与实战第十二章内容

    12.几何着色器 如果不启用曲面细分,那么几何着色器这个可选阶段将会在位于顶点着色器和像素着色器之间.顶点着色器以顶点作为输入数据,而几何着色器以完整的图元为输入数据.与顶点着色器不同的是,顶点着色器 ...

  6. illumina SNP 芯片转基因型矩阵

    一.芯片数据 此次拿到的illumina芯片数据并不是原始的数据,已经经过GenomeStudio软件处理成了finalreport文件,格式如下: 之前没处理过芯片数据,对于这种编码模式(Forwa ...

  7. Python—安装跟爬虫相关的包

    舆情爬虫分析:硬件:   4台服务器,分别放redis.python爬虫.mysql和 kafka四大板块.软件:1. mysql2. redis    #leap1  /usr/bin/redis- ...

  8. phpexcel 另存Excel文件方式

    $w = new PHPExcel_Writer_Excel5($e); $dir = 'path/title.xls'; $w->save($dir);

  9. C#集合Dictionary中按值的排序

    C#集合Dictionary中按值的降序排列 static void Main(string[] args) {             Dictionary<string, int> d ...

  10. Vulnstack内网靶场5

    实验环境搭建 漏洞详情 (qiyuanxuetang.net) "此次靶场虚拟机共用两个,一个外网一个内网,用来练习红队相关内容和方向,主要包括常规信息收集.Web攻防.代码审计.漏洞利用. ...