当前位置: 首页 > news >正文

主机托管业务百度运营优化师

主机托管业务,百度运营优化师,移动分销系统代理,梅州市做试块网站系列文章目录 文章目录 系列文章目录前言一、什么是锁竞争?二、什么是类锁?什么是实例对象锁?三、给类对象加锁不是锁住了整个类四、总结 前言 java选手们应该都对锁不陌生,加锁了就是为保证操作语句的原子性,如果你是…

系列文章目录

文章目录

  • 系列文章目录
  • 前言
  • 一、什么是锁竞争?
  • 二、什么是类锁?什么是实例对象锁?
  • 三、给类对象加锁不是锁住了整个类
  • 四、总结


前言

java选手们应该都对锁不陌生,加锁了就是为保证操作语句的原子性,如果你是刚学并发编程,是否傻傻分不清楚对象锁和类锁呢?别怕!!!你看到了我的这篇文章就能帮你解决这个困惑~~


一、什么是锁竞争?

当我们使用synchronized个一个对象加上了锁,多个线程尝试在自己的内存空间上拿到这个加了锁的对象时,此时就会发生锁竞争,在竞争的瞬间只有一个线程可以拿到这个加了锁的对象,此时线程就是安全的。
举个例子:

假设你寝室里的卫生间只有一个马桶,某天晚上,你室友们同时都想去上厕所,那么你们就是要去抢这个厕所。
在这里你和你的室友就是线程;
厕所里的马桶就是对象;
厕所门上的锁就是synchronized;

二、什么是类锁?什么是实例对象锁?

类锁就是对类的成员或者方法或者类对象加锁,类锁本质就是对类对象加锁。

什么是类对象?
类对象就是.class对象,类对象详细的记录了程序员在定义这个类时全部的信息,比如:属性、方法等
你可以看到类对象是.class,类对象来源与.class文件,.class文件是由javac编译器根据.java源文件编译出来的,你可以理解成源文件只有一份,所以类对象也只有一份

类锁:
给static修饰的属性或者方法或者直接在synchronized(类.class)都是在给类加锁
实例对象锁:
给非static修饰的属性或者方法加锁

//给count加2000次
class A{static int count;//对静态方法加锁,就是对类对象加锁static synchronized void fun1(){for (int i = 0; i < 10000; i++) {count++;}System.out.println("我是类方法"+count);}//对实例方法加锁,就是对实例对象加锁synchronized void  fun2(){for (int i = 0; i < 10000; i++) {count++;}System.out.println("我是实例方法"+count);}
}

三、给类对象加锁不是锁住了整个类

是否线程安全,就看两个线程是否是针尝试获取到同一个加了锁的对象。就算里给类对象加了锁,也不是意味着一个线程拿到锁了,其他线程只能阻塞等待,如果其他线程本来就没有要去获取到这把类锁,而是去获取到实例对象的锁,那么这里就不存在多个线程竞争获取同一个对象竞争同一把锁。

看下面这段代码:

//线程不安全,t1和t2尝试获取的是两个不同的对象,一个是类对象,一个是实例对象,获取的不是同一把锁,不存在锁冲突
public class Test {public static void main(String[] args) throws InterruptedException {A a = new A();//线程1获取到是static修饰的方法Thread t1 = new Thread(()->{A.fun1();try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}});//线程2获取到的是非static修饰的方法Thread t2 = new Thread(()->{a.fun2();});t1.start();t2.start();t1.join();t2.join();}}
class A{static int count;//对静态方法加锁,就是对类对象加锁static synchronized void fun1(){for (int i = 0; i < 10000; i++) {count++;}System.out.println("我是类方法"+count);}//对实例方法加锁,就是对实例对象加锁synchronized void  fun2(){for (int i = 0; i < 10000; i++) {count++;}System.out.println("我是实例方法"+count);}
}

线程不安全,结果小于20000:
在这里插入图片描述

下面两段代码,多个线程就是在尝试获取同一锁
看下面这段代码:
t1、t2尝试获取同一把锁,实例对象锁

//t1和t2尝试获取到同一把锁,
public class Test {public static void main(String[] args) throws InterruptedException {A a = new A();//线程1获取到是非static修饰的方法Thread t1 = new Thread(()->{
//           A.fun1();a.fun2();});//线程2获取到的是非static修饰的方法Thread t2 = new Thread(()->{a.fun2();
//            A.fun1();});t1.start();t2.start();t1.join();t2.join();}}
class A{static int count;//对静态方法加锁,就是对类对象加锁static synchronized void fun1(){for (int i = 0; i < 10000; i++) {count++;}System.out.println("我是类方法"+count);}//对实例方法加锁,就是对实例对象加锁synchronized void  fun2(){for (int i = 0; i < 10000; i++) {count++;}System.out.println("我是实例方法"+count);}
}

看下面一段代码:
t1和t2尝试获取到同一把类锁

public class Test {public static void main(String[] args) throws InterruptedException {A a = new A();//线程1获取到是static修饰的方法Thread t1 = new Thread(()->{A.fun1();
//            a.fun2();});//线程2获取到的是static修饰的方法Thread t2 = new Thread(()->{
//           a.fun2();A.fun1();});t1.start();t2.start();t1.join();t2.join();}}
class A{static int count;//对静态方法加锁,就是对类对象加锁static synchronized void fun1(){for (int i = 0; i < 10000; i++) {count++;}System.out.println("我是类方法"+count);}//对实例方法加锁,就是对实例对象加锁synchronized void  fun2(){for (int i = 0; i < 10000; i++) {count++;}System.out.println("我是实例方法"+count);}
}

四、总结

多线安全是否安全和不单单只是看synchronized修饰的属性,因为java里的任何对象都可以被synchronized修饰,关键在于多个线程是否是尝试获取相同的锁对象,如果是同一把锁就会发送锁冲突,线程安全。否则就不存在锁冲突,线程不安全。
所以不要被类锁和对象锁的名称给迷晕了,就看多个线程是否是在获取同一把锁,如果是同一个实例对象锁,线程安全;如果是同一个类对象锁,线程安全;如果是一个线程获取类锁,一个线程获取实例对象锁,不安全。

http://www.ds6.com.cn/news/58266.html

相关文章:

  • 旅游电子商务网站建设技术规范百度的网站网址
  • 江苏省城乡建设厅网站首页重庆百度推广电话
  • 个人备案门户网站电商运营基本知识
  • 怎样建网站域名河北seo推广
  • 怎样自己做网站推广网络推广员的工作内容和步骤
  • 宜春公司做网站seo建设
  • 网站域名解析登陆天门seo
  • wordpress app 使用专业seo培训
  • 四川建设发展股份有限公司网站深圳网站建设资讯
  • 外贸网站平台排行榜2023年新闻摘抄十条
  • 长春二道网站建设网站推广app软件
  • 三元区建设小学网站美国搜索引擎浏览器
  • 柳州正规网站制作公司百度网盘客户端下载
  • 服装网站建设策划书的基本结构网站设计师
  • 互联网个人信用信息服务平台石家庄seo排名公司
  • 网页设计网站链接怎么做网络营销环境
  • php网站怎么做伪静态制作网站要找什么公司
  • 网站集约化建设的优点厦门seo推广优化
  • 做斗图网站目前较好的crm系统
  • 武威 网站建设天津百度快照优化公司
  • 杭州网站备案漳州seo建站
  • 上海集团网址西安seo服务公司排名
  • 有个在家做的客服网站seo技术教程博客
  • 织梦是什么网站百度竞价关键词价格查询
  • 网站域名备案注册证书友妙招链接
  • 常州中环做网站多少钱网站推广郑州
  • 免费网站建设资讯谷歌搜索网页版入口
  • 医院网站建设方案书哈尔滨最新信息
  • 专门做企业名录的网站做网站需要什么条件
  • 网站系统建设太原seo快速排名怎么样