1. Java 访问修饰符 public、private、protected,以及无修饰符(默认)的区别
来自:码不矫情
2. 线程间有哪些通信方式?拓展进程间通信
来自:林风
线程间通信方式
互斥锁提供了以排他方式防止数据结构被并发修改的方法。
信号量 和互斥锁的区别在于:互斥锁只允许一个线程进入临界区,信号量允许多个线程同时进入临界区 互斥锁使用对同一个资源的互斥的方式达到线程同步的目的,信号量可以同步多个资源以达到线程同步。PV操作
读写锁允许多个线程同时读共享数据,而对写操作是互斥的。
条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。
自旋锁与互斥量类似,也是只有解锁和加锁两种状态,它与互斥量的区别在于,它不会阻塞线程。
信号机制(Signal) 类似进程间的信号处理,主要用于处理异常状况,用特定的码代指信息。
进程间的通信方式
管道
管道是一种单向的数据传输方式,实现线程间的通信需要两个管道。
管道这种通信方式的缺点就是通信效率低,好处就是实现简单。
消息队列
为了解决管道通信效率低,可以使用消息队列。
消息队列这种通信方式就是有一个生产者,一个消费者,运送数据的效率取决于消息队列的容量。
消息队列的缺点就是,不适合传输较大的数据。 另外传输数据要进行内核态与用户态之间的拷贝,效率比较低。
共享内存
为了解决内核态与用户态之间数据拷贝带来的开销,可以使用共享内存
共享内存就是通过指针的指向改变来完成数据的访问。
优点就在于可以省去拷贝开销,但是随之而来的问题就是对共享资源互斥访问需要控制,不然会带来安全性问题。
信号量
为了解决对共享资源访问的同步、互斥问题,可以使用信号量。
信号量其实就是一个整型计数器,用来记录资源的数量,通过PV操作来实现进程间的同步、互斥流程。
信号
对于异常情况下的工作模式,就需要用「信号」的方式来通知进程。
信号跟信号量虽然名字相似度很高,但两者用途完全不一样。信号是通过固定的信号标志来传达信息。
Socket
前面涉及到的都是同一台主机间通信方式,还有不同主机间的通信,那就要用到Socket.
创建Socket的系统调用:
int socket(int domain, int type, int protocal)domain 参数用来指定协议族 type 参数用来指定通信特性 protocal 参数原本是用来指定通信协议的,但现在基本废弃。
线程间通信与进程间通信的区别
线程是轻量级的进程 系统进行资源调度的基本单位是进程,但是因为进程上下文切换开销太大,所以有了线程,节省开销。 线程本身也是共享进程的内存,上下文切换方便。
安全性 线程间通信的安全性相对较低,需要采用同步机制来保证共享变量的正确性; 而进程间通信的安全性相对较高,进程之间相互隔离,不会对对方的内存进行非法操作。
3. 什么是分布式?为什么需要分布式?
来自:编程导航官方
分布式是指在多台计算机上协同工作的系统,这些计算机通过网络连接在一起,共同完成一个任务。
分布式系统能够有效地解决单台计算机处理能力不足、系统容易宕机、数据存储容量有限等问题,同时能够提高系统的可靠性、可用性和性能,适用于数据量较大、并发量高、访问频繁的场景。此外,分布式系统还可以通过横向扩展的方式提高系统的性能和可靠性,同时降低单点故障的风险,提高了系统的可伸缩性,方便进行升级和维护。
在分布式系统中,由于数据和计算任务被分布在多台计算机上,不同计算机之间需要进行通信和协调,因此需要解决分布式一致性、负载均衡、故障恢复、数据共享和安全等问题,同时需要考虑数据的一致性和可靠性。因此,分布式系统的设计和实现比单机系统更加复杂和困难,需要考虑到多个因素的综合影响。