java面试题目--基础部分(2)

进程,线程相关题目

先说所进程,进程是程序运行和资源分配的最基本单位,一个程序最少有一个进程看,一个进程最少有一个线程。进程在程序运行过程中拥有一个独立内存单元,而多个线程共享内存资源,减少切换次数,效率反而会更高。线程是进程的一个实体,是cpu调度和分派的基本单位,是比程序更小的独立运行单位,同一个进程的多个线程可以并发执行。

线程中的start() 和run()区别

public class TestThread1 {

	
	public static void main(String[] args) {
		Runnable1 a = new Runnable1();
		//a.run();
		Thread t = new Thread(a);
		//t.start();
		
		
		for (int i = 0; i < 50; i++) {
			System.out.println("主线程"+i);
		}
	}
}
  class Runnable1 implements Runnable{
	
	public void run() {
		for (int i = 0; i < 50; i++) {
			System.out.println("分支线程"+i);
			
		}
		
	}
}

start()会和主线程main轮流执行!!
运行后结果如下:

主线程0
分支线程0
主线程1
分支线程1
主线程2
分支线程2
主线程3
分支线程3
主线程4
分支线程4
主线程5
分支线程5
主线程6
分支线程6
主线程7
分支线程7
主线程8
分支线程8
主线程9
分支线程9
主线程10
分支线程10

而 run() 则会执行完自己再执行主线程

再来说一下synchronized(同步)
1.synchronized它的目的是干嘛的?
首先synchronized关键字是Java提供的机制锁,主要用来解决线程同步的问题, synchronized可以修饰类,可以修饰代码块,可以修饰方法,也可以修饰一个静态的方法。

但是!!!synchronized不可以修饰变量!(不能直接使用synchronized声明一个变量)

2.synchronized它的原理是什么?
synchronized是通过对象内部一个叫监视器锁来实现的(monitor),但是监视器锁本质又是依赖于底层的操作系统的互斥锁(Mutex Lock)来实现的。但是这么做成本高,转化也需要时间,这就是为什么我们说synchronized效率低的原因。

举个栗子!

public class TestThread1 implements Runnable {

	@Override
	public void run() {
		
			synchronized (this) {
			for (int i = 0; i < 5; i++) {
				System.out.println(Thread.currentThread().getName()+"和"+i);
			}
			
		}
		
	}
	public static void main(String []args){
		TestThread1 t = new TestThread1();
		Thread t1 = new Thread(t,"A");
		Thread t2 = new Thread(t,"B");
		t1.start();
		t2.start();
		
	}



}

运行结果:
A和0
A和1
A和2
A和3
A和4
B和0
B和1
B和2
B和3
B和4

假如我们不用synchronized,就是说我把这段代码去掉 synchronized (this) {

那么现在运行结果就变成了这样:
A和0
B和0
A和1
B和1
A和2
B和2
A和3
B和3
A和4
B和4

OK冷静分析一下:
当两个并发线程访问同一个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

猜你喜欢

转载自blog.csdn.net/weixin_44791262/article/details/90723212