操作系统

来源:互联网 发布:万网域名备案在哪 编辑:程序博客网 时间:2024/05/22 00:44

进程间通信:

1.管道及有名管道
2.信号
3.共享内存
4.信号量:用于进程间以及同一进程不同线程间的同步手段
5.套接字(socket):更一般的进程间通信,可用于不同机器间的进程通信

Java并发:

1.线程的基础知识:

1线程实现的方法:
public void Test1 implements Runnable{
public void run(){//重写}
}
main(){
Thread t=new Thread(new Test1());
t.start();}
start方法调用之后就立即返回了;
使用Executor
ExecutorService exc=Executors.newCachedThreadPool();
exc.executor(new Test1());
exc.shutdoen();
另外一种是该类extends Thread,然后重写run方法
一般使用implements Runnable这个方法,
thread.yeild() 表示让步,表明该线程的run方法已经执行完毕,可切换到其他的线程,但切不切还不一定,只是表明可以切了;
thread.join等待另一个线程执行完,再执行该线程

2.中断

,Java中的interrupt()不是真正的中断,只是设置中断位为true,会抛出中断异常,当捕获到这个异常时,中断位被清除(true->false),此时调用isinterrupted()返回false,在Java中中断只被处理一次,你捕获了异常表明你有能力处理异常,因此不需要被上层调用者看到这个中断,所以要清除中断位;
interrupted()是静态方法,返回线程的中断状态,如果异常没有被捕获,则返回true,并清除中断标志位,第二次再调用interrupted则返回false;
如果一直调用isinterrupted()则一直返回true

3.解决共享资源竞争

synchronized关键字与lock的区别
对象A和B共享变量O,假设A已经获得O的锁,此时B想获取O的锁
reentrantlock()修饰的话,B等待足够长时间,就会停止等待,去干别的事情,
而synchronized修饰的话,B会一直等待,直到A释放锁;
reentrantlock获取锁的三种方式:
lock(),获得锁则返回true,否则B处于休眠状态,直到A释放锁;
trylock(),获得锁则返回true,否则不会等待,而去干其他事;
trylock(long timeout,TimeUnit unit)如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false;
lock需要自己在finally字句中手动释放锁;synchronized不需要
如果竞争不是很激烈是,synchronized要优于lock,如果竞争很激烈,则synchronized性能会下降很多,而lock则性能不会下降;

线程间通信:

wait()和notify,notifyAll()

死锁:

当一下四种条件同时满足时,就会产生死锁:
1.互斥条件。任务使用的资源至少有一个是不能共享的。
2.至少有一个任务A持有资源,而且A正在等待获取资源O,而此时O被任务B持有;
3,资源不能被抢占。哲学家很有礼貌,不能去抢夺筷子;
4.必须有循环等待,这时,一个任务等待其他任务持有的资源,后者又在等待另一个任务所持有的资源,一直下去,直到有一个任务等待第一个任务持有的资源。
要发生死锁的话必须上面四个条件同时满足,缺一不可;所以要防止死锁的话,就要破坏上面的条件,显然第四个条件是最容易破坏的。
下面开始学习socket编程

原创粉丝点击