首页 > 其他分享 >多线程 问答

多线程 问答

时间:2023-08-19 15:24:39浏览次数:35  
标签:java int lock private 线程 new 多线程 问答

1、线程的状态或什么周期

新建,就绪,运行,阻塞,销毁

new, runnable,running,blocked,terminated

 java角度

 

 

2、java里面,wait和 sleep的区别

wait 是object的方法,等待时会释放锁

sleep是 线程Thread的方法,睡眠时不会释放持有的对象锁,需要捕获异常。结束睡眠后,进入 runnable状态。如果线程异常终止,terminated状态

object的 wait,notify,notifyall 用于同步控制

sleep可以在任何地方用

3、进程和线程的区别

进程是最小的资源分配单位,线程是最小的执行单位

4、程序开多少线程合适

2n+1

5、synchronized 和 lock的区别

简述一下sync从偏向锁 升级到到轻量锁的情况

前提:在偏向锁和轻量锁开启的情况下,当线程进入时,首先会加上偏量锁

1、判断是否可偏向的状态:markWord锁标志为 01,是否偏向锁为 1

2、当可偏向,查看线程ID 如果是自己,则执行代码(第5步);否则执行第3步

3、cas竞争锁,如果成功,则记录markword里面的线程ID为自己,执行代码(第5步);否则执行第4步

4、如果cas失败表示有竞争,达到savepoint时,偏向锁线程挂起,升级为轻量锁。 被阻塞在安全点的额线程继续往下执行同步代码???

5、执行代码

 

6、DCL double check?

if singleton == null

  synchronized(singleton.class){

    if singleton == null{singleton=new singleton();}

}

7、condition实现阻塞队列,(生产者,消费者)

import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class ProviderConsumer<T> {
    private int length;
    private Queue<T> queue;
    private ReentrantLock lock=new ReentrantLock();
    Condition providerCondition =lock.newCondition();
    Condition consumerCondition =lock.newCondition();
    private ProviderConsumer(int length){
        this.length=length;
        queue=new LinkedList<T>();
    }
    private void add(T product){
        lock.lock();
        try {
            while (queue.size()>=length) {
                providerCondition.await();
            }
            queue.add(product);
            consumerCondition.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            lock.unlock();
        }

    }
    private T consume(){
        lock.lock();
        try {
            while(queue.isEmpty()) {
                consumerCondition.await();
            }
            T product=queue.remove();
            providerCondition.signal();
            return product;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
        return null;
    }
}

=

8、按顺序打印abc

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class PrintABC {
    ReentrantLock lock=new ReentrantLock();
    Condition conditionA= lock.newCondition();
    Condition conditionB= lock.newCondition();
    Condition conditionC= lock.newCondition();
    int value=0;
    
    //打印几遍
    int count;
    private PrintABC(int count){
        this.count=count;
        
    }
    private void printabc(){
        new Thread(new ThreadC()).start();
        new Thread(new ThreadB()).start();
        new Thread(new ThreadA()).start();
    }

    public static void main(String[] args) {
        PrintABC abc=new PrintABC(2);
        abc.printabc();
    }
    class ThreadA implements Runnable{

        @Override
        public void run() {
            lock.lock();
            try {
                for (int i = 0; i < count; i++) {
                    while(value%3!=0){
                        conditionA.await();
                    }
                    System.out.println("A");
                    value++;
                    conditionB.signal();
                }
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }finally {
                lock.unlock();
            }

        }
    }
    class ThreadB implements Runnable{

        @Override
        public void run() {
            lock.lock();
            try {
                for (int i = 0; i < count; i++) {
                    while(value%3!=1){
                        conditionB.await();
                    }
                    System.out.println("B");
                    value++;
                    conditionC.signal();

                }
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            } finally {
                lock.unlock();
            }

        }
    }
    class ThreadC implements Runnable{

        @Override
        public void run() {
            lock.lock();
            try {
                for (int i = 0; i < count; i++) {
                    while(value%3!=2){
                        conditionC.await();
                    }
                    System.out.println("C");
                    value++;
                    conditionA.signal();

                }
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            } finally {
                lock.unlock();
            }

        }
    }


}

  

  

=

 

参考地址:

https://blog.csdn.net/Firstlucky77/article/details/125173318

 

标签:java,int,lock,private,线程,new,多线程,问答
From: https://www.cnblogs.com/qingmaple/p/17642488.html

相关文章

  • c++ 多线程
    #include<iostream>#include<functional>#include<thread>#include<future>//std::promise,std::future#include<chrono>voidprint_int(std::future<int>&fut){intx=fut.get();......
  • C++ 多线程详解之异步编程 std::packaged_task
    std::packaged_task将任何可调用对象(比如函数、lambda表达式等等)封装成一个task,可以异步执行。执行结果可以使用std::future获取。比如下面的例子,构造一个std::packaged_task后,get_future()函数返回一个std::future对象,可以获取task异步或者同步执行的结果。#includ......
  • 知道问答智能层级调度
    1、背景目前知道的问题分发主要以端分发为主,其优化目标为问题解决率和回答量,即将不同来源的问题分发到不同的回答平台来提高回答量和解决率;这种分发存在以下几个问题:缺乏内容和用户的层次关联端分发平台没有考虑问题质量和回答用户的层次协同,导致整站在随着问题量暴增的情况......
  • 在C++中实现多线程异步TCP消息发送
    本文主要解释了在C++中如何实现一个多线程,异步发送TCP消息的系统。我们将会用到C++的标准库和Boost.Asio库。基础知识TCP(TransmissionControlProtocol):是一种面向连接的、可靠的、基于字节流的通信协议。它在两个网络节点之间创建一个稳定的连接,以便可以交换字节流。多线程编程:......
  • 爬虫速度翻倍!多线程技术助你提升批量爬虫采集效率
       今天要和大家分享一些关于如何利用多线程技术提升批量爬虫采集效率的实用技巧。如果你也在面对大量数据采集任务的时候疲于奔命,那么这些经验对你来说将非常有帮助。废话不多说,让我们开始吧!1.多线程是什么?——理解多线程的概念多线程是指在一个程序中同时运行多个......
  • 深入探索智能未来:文本生成与问答模型的创新融合
    深入探索智能未来:文本生成与问答模型的创新融合1.FillingModelwithT51.1背景介绍该项目用于将句子中[MASK]位置通过生成模型还原,以实现UIE信息抽取中MaskThenFilling数据增强策略。MaskThenFill是一种基于生成模型的信息抽取数据增强策略。对于一段文本,我们其分......
  • 多线程的“锁”
    其实,很多初学者(包括我自己)初期学习多线程时都被视频带偏了...虽然我始终认为培训班的视频是最适合非科班零基础入门的,但是在多线程方面,无一例外都讲得比较糟糕。感触很深的一点是:很多新手觉得多线程难,并不是因为volatile、ReentrantLock或者Executor线程池,而是从一开始就没弄明白......
  • (随笔)龟兔赛跑(多线程调用同一资源时一个线程结束时其他线程保持运行)
    问题:当其一线程结束运行后其他线程保持运行而非结束现象:控制台会输出两次thewinneris:xxx代码如下packagecom.demo01;/***TODO模拟归途赛跑**@authorpangyangjian*@since2023/8/1616:10*/publicclassTextThread_5implementsRunnable{ @Override......
  • 多线程&异步编程
    多线程&网络编程(异步编程)1)重要性,高并发,短时间内遇到大量请求2)难度硬件.操作系统多线程本身的复杂性,死锁,资源抢占,线程同步...--->多线程进程:一般指程序中运行的程序,实际作用是为程序在执行过程中创建好所需要的环境和资源.线程:是进程的一个实体,是Cpu用来调度......
  • RPA+智能问答实现微信端智能客服
    背景:由于业务发展迅速,服务的商家越来越多,目前我们售后团队都是通过企业微信群和客户进行沟通,平时客户的相关问题也是在企业微信中来讨论解决;但是我们售后团队资源有限,而且有的问题客户会重复问,周末或者晚上售后同学回复不及时影响体验;最重要的一点商家客服习惯于在微信端进行咨......