![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
线程问题
文章平均质量分 84
小董是不懂
正在努力学习的编程菜鸟,博客有问题欢迎私信或者评论讨论
展开
-
多线程案例之阻塞队列与生产者消费者模型
1.如果对一个已经满了的队列进行入队列,此时入队列操作就会阻塞,一直阻塞到队列不满(其他线程出队列元素)之后。2.如果对一个已经空了的队列进行出队列,此时出队列操作就会阻塞,一直阻塞到队列不空(其他线程入队列元素)之后。1>分布式系统中的阻塞结构,并非是简单的数据结构,而是基于这个数据结构实现的服务器程序,又被部署在主机上了。基于阻塞队列,就可以实现"生产者消费者模型"(很朴素的概念,描述的是一种多线程编程的方法)take方法是用来出队列的,也是带有与阻塞功能的,为空的时候出队列就会造成阻塞。原创 2023-12-03 23:26:07 · 853 阅读 · 1 评论 -
线程的设计模式之单例模式(讲述饿汉以及懒汉模式和他们的线程安全)以及指令重排序
单例 = 单个实例(对象)某个类,在一个进程中,只应该创建出一个实例(原则上不应该有多个),然而使用单例模式,就是对咋们的代码进行进一步的检查举个栗子~~有时候代码中,需要有一个对象来进行管理/持有大量数据此时,有一个对象就可以,比如有一个对象管理10G的数据,但是要不小心创建出了多个对象,内存空间就会成倍增长,机器就会扛不住的所以唯一对象要如何去保证呢?1>假设通过"君子约定",写一个文档,文档上面写着,每个接受的程序员,不可以把这个类创建多个实例,但是显然这个是不靠谱的。原创 2023-12-03 21:07:39 · 865 阅读 · 0 评论 -
线程的内存可见性引起的安全问题(里面还涉及volatile关键字,wait以及notify)
那1号进去一下,没钱,又出门,出来到门口了又想现在里面会不会又有钱了,因为ATM一次不是只能进去一个人嘛,本应该1号出来了要走在一旁让后面的滑稽大哥进去才是, 但是1号不啊 ,1号在这里反复摇摆,进进出出,就让后面的人进不去里面了(不考虑1号会被打的问题哈)原创 2023-12-02 21:24:50 · 772 阅读 · 1 评论 -
线程中的死锁问题
这里面由于只有四根筷子,所以我们的滑稽在想吃面时候,需要从左边拿一根,右边拿一根,这样才可以凑成一双吃面条,当一个滑稽吃完的时候,就会放下,然后另一个滑稽拿筷子吃,因为滑稽们是著名哲学家,除了吃面还要进行思考!但是总有意外发生,有一天,他们四个同时想吃面条,这时候他们同时拿起了自己的一根筷子,可是一根吃不了面的,但是他们又互不谦让,就一直僵持着,吃不了面。线程2在获取到了锁b的情况下,又想获取锁a,这个时候,线程就会卡住了,无法继续工作。原创 2023-12-02 16:52:15 · 1013 阅读 · 1 评论 -
线程安全中的加锁问题
某个代码,无论是单线程执行还是多线程执行,都不会有bug,就称为线程安全.若是一个代码,单线程代码下是安全的,然后多线程下可能有bug,这种情况就称为"线程不安全"或者是"线程安全问题".原创 2023-12-02 15:29:24 · 1296 阅读 · 1 评论 -
线程的状态种类以及含义和切换状态
指定时间的阻塞,就在到达一定时间内之后会自动解除阻塞,使用sleep会进入这个状态,使用带有超时时间的join也会.就是像图中红圈中的,已经创建好了t1和t2,但是还没进行下一步的t1.start();这一步,就是NEW状态。不带时间的阻塞,就是死等,必须要满足一定条件才会阻塞解除,join或者wait都会进入WAITING。当程序卡住的时候,意味着一些关键的线程阻塞了,就可以观察线程状态,分析出一些原因.因为学习状态,做大的作用就是调试多线程的bug时候,可以作为重要参考,由于锁竞争引起的阻塞。原创 2023-11-30 13:57:15 · 314 阅读 · 0 评论 -
Thread 类的基本用法
如果是Runnable或者lambda表达式,this就无能为力了,此时的this就不会再指向Thread对象了,就只能使用 Thread.currentThread();具体的原因是: 在执行sleep的过程中,会调用interrupt,大概率sleep的睡眠时间并没有到,就被唤醒了,然后被提前唤醒会做两件事。这个操作,这个括号里面填写的是时间,毫秒为单位!这个的操作就是获取当前线程实例,哪个线程调用,就获取哪个线程的实例(类似于this)多个线程的执行的顺序不是一定的,是随机调度,抢占式执行的。原创 2023-11-30 00:17:00 · 822 阅读 · 0 评论 -
Thread的其他属性与方法以及run和start的区别
在图中的第三个和第四个里面,有一个String name,这个是我们自己在创建线程的时候,默认是按照Thread-0 1 2 3 4…这种名字命名的,通过第三个和第四个我们是可以自己起线程的名字,为了方便调试,而且,名字可重复!这个是把代码设为后台进程,这行代码要写在t.start();这个的话它是创建了一个新的线程,由一个新的线程来执行某个条件,例如输出hello等等。就像图中一样,第二次调用start的时候,就会报错了,只会有一个线程在执行!前台的运行,会阻止线程的结束。原创 2023-11-29 23:00:25 · 364 阅读 · 1 评论 -
创建线程的五种写法
最后,要注意一点,在这个创建线程的方法中.除了第五种,前四种方法,都重写了run方法!原创 2023-11-29 22:11:12 · 501 阅读 · 1 评论 -
进程和线程有何区别与联系
关于线程和进程之间的问题原创 2023-11-28 16:15:10 · 1046 阅读 · 0 评论