首页 > 编程语言 >一、【Java】多线程与高并发

一、【Java】多线程与高并发

时间:2022-12-22 15:37:48浏览次数:48  
标签:count Java Thread synchronized void 并发 线程 多线程 public

一、启动多线程的三种方式

1、继承Thread 接口类 实现 run() 方法

static class MyThred extends Thread{

 @Override

 public void run(){system.out.println("Hellow MyThread!"))}

}

 

2、继承Runnable 接口类 实现 run() 方法

static class MyThred extends Runnable{

 @Override

 public void run(){system.out.println("Hellow Run!"))}

}

 

3、通过线程池也可以启动一起线程

Executors.newCachedThread

二、线程的 Sleep_Yield_Join基本 方法

1、Sleep()

1、Thread.sleep(500);

概念:CPU没有线程概念,当前线程在这休息500毫秒,这段时间其他线程去运行。运行完后再接着回来运行

 

2、Yield()

Thread.yield();

概念:运行过程中,yield() 一下,本质上是让出一下cpu,返回 “就绪” 状态,其他线程能不能抢到不管。

 

3、Join()

 

Thread t1=new Thread(()->{

 for(int i=0;i<100;i++)

 {

 System.out.println("A"+i);

 try{

 Thread.sleep(500);

 }catch(InterrupedException e){

 e.printStackTrace();

 }

 }

});





Thread t2=new Thread(()->{

 try{

 t1.join();

 }catch(InterrupedException e){

 e.printStackTrace();

 }

});

 

概念:当运行t2线程的时候调用一下t1线程,当t1线程完成以后,回来接着调用t2线程。

 

三、线程的状态

1、java里的线程状态迁移图,都是通过JVM来管理的,通过操作系统被管理。,通过线程的getState()获取状态。

 

 

1、NEW 状态:创建了,未调用初始状态。

2、Runnable 状态:交给操作系统执行(线程调度器)

2.1、Ready:就绪状态,在CPU的等待队列里,排着队,还没运行呢,

2.2、Running:正在运行的状态,正在CPU里运行中。

3、Teminated 状态:运行结束。

4、TimedWaiting:等待状态,Thread.sleep(time),o.wait(time),t.join(time),LockSupport.parkNanos(),LockSupport.partUntill(),会进入这个状态。

5、Waitig:等待状态,o.wait(), t.join() ,LockSupport.part(),会进去这个状态

6、Blocked:阻塞状态;进入到同步代码块,没有得到锁的时候。

 

四、高并发、sysnchronized 关键字

1、多个线程访问一个资源的时候,对这个资源加锁

private int count=10;

private Object o=new Object();

public void m(){

 synchronized(o){//任何线程要想执行以下代码,必须先拿到o的锁

 count--;

 System.out.println(Thread.currentThread().getName()+"count="+count);

 }

}

 

每次new一个object很麻烦,可以锁当前对象 this

private int count=10;

public void m(){

 synchronized(this){

 count--;

 System.out.println(Thread.currentThread().getName()+"count="+count);

 }

}

 

可以简写成以下代码,一个 synchronized 方法

private int count=10;

public synchronized void m(){//任何线程要想执行以下代码,必须先拿到o的锁

 count--;

 System.out.println(Thread.currentThread().getName()+"count="+count);

}

 

静态方法也可以

 

private int count=10;

public synchronized static void m(){//这里等同于synchronized(T.class)

 count--;

 System.out.println(Thread.currentThread().getName()+"count="+count);

}



public static void mm(){

 synchronized(T.class){

 count--;

 }

}

 

五、synchronized的底层实现

1、JDK早期 synchronized 是重量级的,要向系统申请锁,很慢

2、后来JDK(1.5)改进,锁升级,原来都是找操作系统申请锁,到后期对synchronized 做了一些改进,效率高不少。

例如:synchronized(object)的时候,只有一个线程访问,是不给他加锁的,只记录线程ID(偏向锁)。如果有线程争用,就升级为(自旋锁),自旋锁 如果一个线程 旋了 10次以后 还没得到锁,则升级为(系统锁)操作系统锁。

3、只能升级锁,不能降级,例如多个线程通过争用升级到(系统锁),线程数下去以后,不会降级!!!

5、加锁代码执行时间长的情况下,线程数比较多,使用系统锁(系统锁),加锁代码执行时间短,线程数少的情况下,使用(自旋锁)。

 

六、使用synchronized注意

1、不能使用String常量、Integer、Long 等基础数据类型。

2、synchronized 锁不住空对象,空对象没有markword。

标签:count,Java,Thread,synchronized,void,并发,线程,多线程,public
From: https://www.cnblogs.com/lwqstyle/p/16998796.html

相关文章

  • javaweb总结4-servlet基础
    正如ASP.NET的核心是IHttpHandler一样,JavaWeb的核心是Servlet接口,位于javax.servlet命名空间中。Filter的概念可以参考ASP.NET的HttpModule,Servlet中的各种Listener可以参......
  • javaweb总结3-Maven Web项目的基本结构
    鉴于目前JavaIDE众多并且都有一定的拥泵,Eclipse的JavaWeb项目不具有可移植性。Maven即解决了项目结构的规范问题又提供了强大引用处理等强大的功能,在项目布局等方面已经......
  • javaweb总结5-自定义Session
    Session在存储安全性要求较高的会话信息方面是必不可少的,Session当然绝对不是用来存储用户登录状态的,但类似验证码等敏感信息却必须存储在Session中。对于分布式Web应用自......
  • javaweb总结1-Java Web 模块结构
    JSP文件和AXPX文件类似,路径和URL一一对应,都会被动态编译为单独class。JavaWeb和ASP.NET的核心是分别是Servlet和IHttpHandler接口,因此无论是基础的Page文件(JSP、ASPX)方式......
  • javaweb总结2-Java Web项目的基本结构[Eclipse Dynamic Web Project]
    EclipseDynamicWebProject项目(1)可以配置需要编译的源码目录和输出目录,默认编译src目录下的源文件到build\classes目录下。(2)可以配置WEB-INF的根目录,默认为WebContent......
  • JAVA继承得深度了解
    继承与合成基本概念继承:可以基于已经存在的类构造一个新类。继承已经存在的类就可以复用这些类的方法和域。在此基础上,可以添加新的方法和域,从而扩充了类的功能。合成:在......
  • 多线程原理和常用方法以及Thread和Runnable的区别
    多线程原理随机性打印CPU有了两条执行的路径,CPU就有了选择,一会执行main方法一会执行run方法。也可以说两个线程,一个main线程一个run线程一起请求CPU的执行权(执行......
  • 多线程下载USGS Lidar Explorer Map点云数据
    1.简介美国地质勘探局(UnitedStatesGeologicalSurvey,简称USGS),是美国内政部所属的科学研究机构。负责对自然灾害、地质、矿产资源、地理与环境、野生动植物信息等方......
  • 教你用JavaScript获取大转盘
    案例介绍欢迎来到我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个大转盘。当你难以抉择的时候不妨用这个案例来帮你做选择。通过编......
  • JAVA获取月份开始和月末最后一天
    packagecom.swift.oa;importjava.text.SimpleDateFormat;importjava.util.Calendar;publicclassAPP4{publicstaticvoidmain(String[]args){......