线程的两种创建方式

  • 继承 Thread

    class Thr extends Thread {
       @Override
       public void run() {
           Thread.currentThread().setName("bbb");
           System.out.println(Thread.currentThread().getName());
      }
    }
  • 实现 runnable接口

    class TT implements Runnable {
       @Override
       public void run() {
           System.out.println(Thread.currentThread().getName());
      }
    }
  • 执行线程

    public static void main(String[] args) {
           new Thr().start();
           new Thread(new TT(),"thread").start();
      }

synchronized 的使用

理解synchronized 的加锁原理.

package concurrent01.c000;

public class T {

   private Integer count = 10;

   public void run() {
       
       for (int i = 0; i < 10; i++) {
               count --;
           System.out.println(Thread.currentThread().getName() +"thread name is"+count);
  }
}
   
}

多个线程执行run()方法的时候,确保count的值每次只被一个线程修改.有四种方式

  1. 使用volatile关键字修饰

    private volatile static Integer count = 10;
  2. 使用synchronized关键字,给代码上锁

    package concurrent01.c000;

    public class T {

       private Integer count = 10;

       private  Object o = new Object();

       public void t1() {

           synchronized(o){
           for (int i = 0; i < 10; i++) {
                   count --;
               System.out.println(Thread.currentThread().getName() +"thread name is"+count);
          }
      }
    }
       
    }
  3. 可以将o替代成this.

    public void t1() {
           synchronized(this){
           for (int i = 0; i < 10; i++) {
                   count --;
               System.out.println(Thread.currentThread().getName() +"thread name is"+count);
          }
      }
  4. 也可以在方法上面加锁,这种方法和第三钟方式完全等效,代码在执行的时候,可以看成是一种方式

    package concurrent01.c000;

    public class T {
       private volatile  Integer count = 10;
       public synchronized  void t1() {
           for (int i = 0; i < 10; i++) {
                   count --;
               System.out.println(Thread.currentThread().getName() +"thread name is"+count);
          }
      }
    }

    synchronized 在执行一段代码的时候,需要给一个对象加锁.

    执行过程

    线程执行代码块,发现synchronized,查找锁对象

    锁对象头空间有一个markdown标识,如果是00,说明这段代码还没有加锁,线程拿到代码的执行权,并给锁对象markdown标识设置为01,加锁.

    其他线程执行到这里的时候,去查看锁对象的标识,发现是01,说明这段代码已经加锁,进入等待状态.

    拿到锁的线程,执行完成之后,将锁对象的标识设置为00,即解锁

线程的创建方式以及synchronize的使用的更多相关文章

  1. Java多线程——线程的创建方式

    Java多线程——线程的创建方式 摘要:本文主要学习了线程的创建方式,线程的常用属性和方法,以及线程的几个基本状态. 部分内容来自以下博客: https://www.cnblogs.com/dolph ...

  2. Java线程的创建方式三:Callable(四)

    一.Java实现多线程的三种方式 方式一:继承Thread类: public class Test extends Thread { public static void main(String[] ...

  3. Java并发编程(01):线程的创建方式,状态周期管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.并发编程简介 1.基础概念 程序 与计算机系统操作有关的计算机程序.规程.规则,以及可能有的文件.文档及数据. 进程 进程是计算机中的程序 ...

  4. java之线程(线程的创建方式、java中的Thread类、线程的同步、线程的生命周期、线程之间的通信)

    CPU:10核 主频100MHz 1核  主频    3GHz 那么哪一个CPU比较好呢? CPU核不是越多越好吗?并不一定.主频用于衡量GPU处理速度的快慢,举个例子10头牛运送货物快还是1架飞机运 ...

  5. 【Java】线程的创建方式

    1.继承Thread类方式 这种方式适用于执行特定任务,并且需要获取处理后的数据的场景. 举例:一个用于累加数组内数据的和的线程. public class AdditionThread extend ...

  6. day 33 什么是线程? 两种创建方式. 守护线程. 锁. 死锁现象. 递归锁. GIL锁

    一.线程     1.进程:资源的分配单位    线程:cpu执行单位(实体) 2.线程的创建和销毁开销特别小 3.线程之间资源共享,共享的是同一个进程中的资源 4.线程之间不是隔离的 5.线程可不需 ...

  7. Java多线程并发01——线程的创建与终止,你会几种方式

    本文开始将开始介绍 Java 多线程与并发相关的知识,多谢各位一直以来的关注与支持.关注我的公众号「Java面典」了解更多 Java 相关知识点. 线程的创建方式 在 Java 中,用户常用的主动创建 ...

  8. 多线程-2.线程创建方式和Thread类

    线程的创建方式 1.继承Thread类,重写run方法,示例如下: 1 class PrimeThread extends Thread { 2 long minPrime; 3 PrimeThrea ...

  9. 03_线程的创建和启动_实现Runnable接口方式

    [线程的创建和启动的步骤(实现Runnable接口方式)] 1.定义Runnable接口的实现类,并重写其中的run方法.run()方法的方法体是线程执行体. class SonThread  imp ...

随机推荐

  1. Java实现 LeetCode 160 相交链表

    160. 相交链表 编写一个程序,找到两个单链表相交的起始节点. 如下面的两个链表: 在节点 c1 开始相交. 示例 1: 输入:intersectVal = 8, listA = [4,1,8,4, ...

  2. Java实现第九届蓝桥杯耐摔指数

    耐摔指数 题目描述 x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机. 各大厂商也就纷纷推出各种耐摔型手机.x星球的质监局规定了手机必须经过耐摔测试,并且评定出一个耐摔指数来,之后 ...

  3. Java实现第九届蓝桥杯第几天

    第几天 题目描述 2000年的1月1日,是那一年的第1天. 那么,2000年的5月4日,是那一年的第几天? 注意:需要提交的是一个整数,不要填写任何多余内容. import java.util.Cal ...

  4. 用斗地主的实例学会使用java Collections工具类

    目录 一.背景 二.概念 1.定义 2.方法 2.1.排序方法 2.2.查找/替换方法 三.斗地主实例 3.1.代码结构 3.2.常量定义 3.3.单只牌类 3.4.玩家类 3.5.主程序 四.深入理 ...

  5. QPS、TPS、并发用户数、吞吐量关系

    1.QPS QPS Queries Per Second  是每秒查询率 ,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准, 即每秒的响应请求数,也即 ...

  6. 一文了解Docker容器技术的操作

    一文了解Docker容器技术的操作 前言一.Docker是什么二.Docker的安装及测试Docker的安装Docker的Hello world测试三.Docker的常见操作镜像的基本操作容器的基本操 ...

  7. Python 图像处理 OpenCV (10):图像处理形态学之顶帽运算与黑帽运算

    前文传送门: 「Python 图像处理 OpenCV (1):入门」 「Python 图像处理 OpenCV (2):像素处理与 Numpy 操作以及 Matplotlib 显示图像」 「Python ...

  8. VS Code项目中通过npm包的方式共享代码片段的方案实现

    VS Code项目中通过npm包的方式共享代码片段的方案实现 上周在 "VS Code项目中共享自定义的代码片段方案" 的文章中提到过一个共享代码片段的方案,上周经过调研后并没有发 ...

  9. Phoenix入门到实战(一)

      问题导读1.你认为Apache Phoenix与HBase的关系是什么?2.Phoenix安装需要哪些软件?3.如何部署Phoenix? Introduction Apache Phoenix i ...

  10. if test表达式逻辑判断不能用&&

    用&&会报错 用and 例如: <if test="age!=null and name!=null">