iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java基础之线程锁的示例分析
  • 214
分享到

Java基础之线程锁的示例分析

2023-06-20 12:06:11 214人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关Java基础之线程锁的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、 synchronized关键字对象锁a.当使用对象锁的时候,注意要是相同的对象,并且当有线程正

这篇文章将为大家详细讲解有关Java基础线程的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

一、 synchronized关键字

对象锁
a.当使用对象锁的时候,注意要是相同的对象,并且当有线程正在访问对象锁内部的代码的时候,其他线程无法访问。(注意无法访问的范围)。
b.但是并不影响没有使用对象锁的部分的代码的运行。

对象锁分为两类一个叫做synchronized代码块(圆括号内是普通类的对象),另外一个是sybchronized修饰普通成员方法。它们二者其实可以通过this关键字进项转化。

类锁
a. 当使用类锁的时候,只要是同一个类的对象.当有线程正在访问类锁内部的代码的时候,其他线程无法访问。(注意无法访问的范围)
b. 但是并不影响没有使用类锁的部分的代码的运

对象锁分为两类一个叫做synchronized代码块(圆括号内是class对象),另外一个是sybchronized修饰静态成员方法。它们二者其实可以通过class对象进项转化。

注意: 类锁和对象锁之间没有关系.

1、不使用线程锁

如果没有加synchronized关键字,会产生线程交错运行

public class A {void test() {for(int i=0;i<10;i++) {System.out.println("线程:"+i);}}}public class MyThread1 extends Thread{A a;public void run() {a.test();}}public class MyThread2 extends Thread{A a;public void run() {a.test();}}A a = new A();MyThread1 t1 = new MyThread1();MyThread2 t2 = new MyThread2();t1.a = a;t2.a = a;t1.start();t2.start();}}产生如下运行结果:线程:0线程:1线程:2线程:3线程:4线程:0线程:5线程:6线程:7线程:8线程:9线程:1线程:2线程:3线程:4线程:5线程:6线程:7线程:8线程:9

2、使用对象锁

将A类中test方法代码改成如下代码,其他不变,运行测试类可以产生如下结果

public class A {void test() {System.out.println("线程开始");synchronized(this) {for(int i=0;i<10;i++) {System.out.println("线程:"+i);}}System.out.println("线程结束");}}运行测试类会产生如下结果:(注意:”线程开始“不是在对象锁中的内容)线程开始线程:0线程:1线程开始线程:2线程:3线程:4线程:5线程:6线程:7线程:8线程:9线程:0线程:1线程:2线程:3线程:4线程:5线程:6线程结束线程:7线程:8线程:9线程结束

使用synchronized直接修饰方法等价于synchronized(this)修饰方法内的全部代码

public class A {synchronized void test() {System.out.println("线程开始");for(int i=0;i<10;i++) {System.out.println("线程:"+i);}System.out.println("线程结束");}void test1() {synchronized (this) {System.out.println("线程开始");for(int i=0;i<10;i++) {System.out.println("线程:"+i);}System.out.println("线程结束");}}}其他代码是一样的,在MyThread1和MyThread2中无论调用test还是test1,结果是一样的,如下:线程开始线程:0线程:1线程:2线程:3线程:4线程:5线程:6线程:7线程:8线程:9线程结束线程开始线程:0线程:1线程:2线程:3线程:4线程:5线程:6线程:7线程:8线程:9线程结束

对象锁对不同的方法也是有用的(类锁也是如此)

public class A {//synchronized void test() {//for(int i=0;i<10;i++) {//System.out.println("方法test:"+i);//}//}void test() {synchronized(this) {for(int i=0;i<10;i++) {System.out.println("方法test:"+i);}}}//synchronized void test1() {//for(int i=0;i<10;i++) {//System.out.println("方法test1:"+i);//}//}void test1() {synchronized(this) {for(int i=0;i<10;i++) {System.out.println("方法test1:"+i);}}}}MyThread1中调用test方法,MyThread2中调用test1方法,运行结果如下:方法test:0方法test:1方法test:2方法test:3方法test:4方法test:5方法test:6方法test:7方法test:8方法test:9方法test1:0方法test1:1方法test1:2方法test1:3方法test1:4方法test1:5方法test1:6方法test1:7方法test1:8方法test1:9

3、使用类锁

演示当A类中的test方法使用对象锁时,不同对象调用test方法时对象锁是起不到任何作用的

public class A {void test() {synchronized(this) {for(int i=0;i<10;i++) {System.out.println("线程:"+i);}}}}MyThread1和MyThread2是一样的,主要在测试程序的不同测试程序:public class Entrance {public static void main(String[] args) {A a1 = new A();A a2 = new A();MyThread1 t1 = new MyThread1();MyThread2 t2 = new MyThread2();t1.a = a1;t2.a = a2;t1.start();t2.start();}}运行结果:线程:0线程:1线程:2线程:3线程:4线程:0线程:5线程:6线程:7线程:8线程:9线程:1线程:2线程:3线程:4线程:5线程:6线程:7线程:8线程:9

使用类锁会改变这种情况,无论是那个对象,只要调用的是同一个方法就会产生锁

public class A {void test() {synchronized(A.class) {for(int i=0;i<10;i++) {System.out.println("线程:"+i);}}}}运行结果:线程:0线程:1线程:2线程:3线程:4线程:5线程:6线程:7线程:8线程:9线程:0线程:1线程:2线程:3线程:4线程:5线程:6线程:7线程:8线程:9

对象锁分为两类一个叫做synchronized代码块(圆括号内是普通类的对象),另外一个是sybchronized修饰普通成员方法。它们二者其实可以通过this关键字进项转化。

public class A {void test() {synchronized(A.class) {for(int i=0;i<10;i++) {System.out.println("线程:"+i);}}}}运行结果:线程:0线程:1线程:2线程:3线程:4线程:5线程:6线程:7线程:8线程:9线程:0线程:1线程:2线程:3线程:4线程:5线程:6线程:7线程:8线程:9

类锁这对象锁之间是没有任何关系,互不影响互不干涉

public class A {synchronized void test() {for(int i=0;i<10;i++) {System.out.println("方法test:"+i);}}synchronized static void test1() {for(int i=0;i<10;i++) {System.out.println("方法test1:"+i);}}}MyThread1调用test方法,使用对象锁,MyThread2调用test1方法,使用类锁测试程序public class Entrance {public static void main(String[] args) {A a1 = new A();A a2 = new A();MyThread1 t1 = new MyThread1();MyThread2 t2 = new MyThread2();//t1.a = a1;//t2.a = a1;t1.a = a1;t2.a = a2;t1.start();t2.start();}}运行结果:方法test:0方法test:1方法test1:0方法test1:1方法test1:2方法test1:3方法test1:4方法test1:5方法test1:6方法test1:7方法test1:8方法test1:9方法test:2方法test:3方法test:4方法test:5方法test:6方法test:7方法test:8方法test:9

关于“Java基础之线程锁的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: Java基础之线程锁的示例分析

本文链接: https://www.lsjlt.com/news/296583.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java基础之线程锁的示例分析
    这篇文章将为大家详细讲解有关Java基础之线程锁的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、 synchronized关键字对象锁a.当使用对象锁的时候,注意要是相同的对象,并且当有线程正...
    99+
    2023-06-20
  • Java基础之Maven的示例分析
    这篇文章将为大家详细讲解有关Java基础之Maven的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、Maven是什么?Maven是一个跨平台的项目管理工具。作为Apache组织的一个颇为成功的...
    99+
    2023-06-15
  • java基础之this的示例分析
    小编给大家分享一下java基础之this的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、this关键字首先需要提醒的是,在整个Java之中,this是...
    99+
    2023-06-20
  • Java多线程之死锁的示例分析
    小编给大家分享一下Java多线程之死锁的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是死锁死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全...
    99+
    2023-05-30
    java
  • java基础之string类的示例分析
    这篇文章主要为大家展示了“java基础之string类的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java基础之string类的示例分析”这篇文章吧。1、String类1.1两种对象...
    99+
    2023-06-20
  • java基础之多态的示例分析
    小编给大家分享一下java基础之多态的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、多态性多态性是面向对象的最后一个特征,它本身主要分为两个方面: 方...
    99+
    2023-06-20
  • java基础之方法的示例分析
    这篇文章将为大家详细讲解有关java基础之方法的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。JAVA 异常分类及处理 异常分类Throwable 是 Java 语言中所有错误或异常的超类。下一层...
    99+
    2023-06-20
  • Python基础之进程的示例分析
    这篇文章将为大家详细讲解有关Python基础之进程的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、前言进程,一个新鲜的字眼,可能有些人并不了解,它是系统某个运行程序的载体,这个程序可以有单个或...
    99+
    2023-06-15
  • Java基础之包装类的示例分析
    这篇文章将为大家详细讲解有关Java基础之包装类的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、浮点...
    99+
    2023-06-15
  • Java基础之MapReduce框架的示例分析
    小编给大家分享一下Java基础之MapReduce框架的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、MapTask工作机制MapTask就是Map阶...
    99+
    2023-06-15
  • java基础之关键字的示例分析
    这篇文章将为大家详细讲解有关java基础之关键字的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、static关键字1.1 使用static关键字定义属性在讲解static定义属性操作之前,首先...
    99+
    2023-06-20
  • java基础之内部类的示例分析
    这篇文章主要为大家展示了“java基础之内部类的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java基础之内部类的示例分析”这篇文章吧。1、匿名内部类内部类:在一个类的内部定义了另外的...
    99+
    2023-06-20
  • Java基础的示例分析
    小编给大家分享一下Java基础的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1、Java主要特点简单性、跨平台性、分布性、安全性、健壮性、平台独立与可移...
    99+
    2023-06-20
  • nodejs基础之多进程的示例分析
    小编给大家分享一下nodejs基础之多进程的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体如下:Node.js 多进...
    99+
    2022-10-19
  • Java基础之SpringBoot整合knife4j的示例分析
    这篇文章给大家分享的是有关Java基础之SpringBoot整合knife4j的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。插件的特点非常简洁清爽的UI设计,接口的快速搜索。支持个性化设置,个性化设置包...
    99+
    2023-06-15
  • Java基础之颜色工具类的示例分析
    这篇文章主要介绍Java基础之颜色工具类的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于Java的实现了Web MVC设计...
    99+
    2023-06-14
  • java基础之方法与对象的示例分析
    这篇文章主要介绍java基础之方法与对象的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、方法的基本定义限制条件:本次所讲解的方法指的是在主类中定义,并且由主方法由主方法直接调用。方法是指就是一段可以被重复...
    99+
    2023-06-20
  • Javascript基础之类型的示例分析
    这篇文章主要介绍了Javascript基础之类型的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。基本类型  Javascript有5...
    99+
    2022-10-19
  • Python基础之模块的示例分析
    这篇文章给大家分享的是有关Python基础之模块的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、什么是模块容器 -> 数据的封装函数 -> 语句的封装类 -> 方法和属性的封装模块 ...
    99+
    2023-06-15
  • java数组基础的示例分析
    这篇文章主要介绍java数组基础的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!数组数组(Array):相同类型数据的集合。Java 数组初始化的两种方法: 静态初始化: 程序员在初始化数组时为数组每个元素赋...
    99+
    2023-05-30
    java 数组
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作