`

面试经-java线程安全篇

阅读更多

大家学java的人每次出去面试基本上都会遇到问一些线程、锁、阻塞等等问题,线程就会遇到各种不确定性,那么怎么解决这些问题呢?这个是个最大的问题,我按照一些从简到难整理一些思路排序一些简单的例子加上我的理解,供大家讨论一下。

一、线程创建方法

Thread,Runnable

那么问题来了,这三种方式的区别是?

1、Runnable解决了java单继承的问题,用Thread实现起来比较麻烦

2、Runnable很容易实现资源的共享

其实我们翻翻代码就能发现Thread也是impl了Runnable接口,但是最终调用都是通过start()方法调用start0()的native方法来完成新线程的创建,创建好了会直接调用方法的run(),本质上没有太大的区别。

 

二、run、start两个方法的区别  还有能直接调用.run方法吗?(有些脑残的公司可能会问这样的问题)

我解释一下,run就是普通的java method跟普通的唯一区别就是新线程启动默认调用run方法来执行,而start方法是直接调用start0来启动新线程的步骤。

 

三、synchronized关键字

这个在前面的很多文章都提到了这个关键字的使用和详解,但是这个关键字在jdk5之前地位非常之高,新版的jdk有了各种锁资源的办法这个重量级的选手渐渐地用的少了,但是地位依旧很高。

参考http://zhangzhj85.iteye.com/blog/2066401

 

 四、经典问题:有三个线程ID分别是A、B、C,请有多线编程实现,在屏幕上循环打印ABC十次既:ABCABCABC

多个线程访问共享对象或数据的方式

a.将共享数据封装到另外一个对象中,然后将这个对象逐一传递给各个runnable对象,然后线程对共享数据的操作方法也分配到哪个对象身上去完成,这样容易实现对该数据的各个操作的互斥和通信。

b.将这些runnable对象作为某一个类的内部类,共享数据作为这个外部类的成员变量,每个线程对共享数据的操作方法也分配到外部类,以便实现对共享数据进行各个操作的互斥和通信,作为内部类的runnable对象调用外部类的这些方法。

两张方法组合

 总之,要同步互斥的几段代码最好分别放在几个独立的方法中,这些方法再放到同一个类中。

 

传统实现代码

package com.cn;

public class ThreadABC {
	int i = 1;
	Object o = new Object();

	public void printA() throws InterruptedException {
		synchronized (o) {
			while (i != 1) {
				o.wait();
			}
			System.out.println("a");
			i =2;
			o.notifyAll();
		}
	}

	public void printB() throws InterruptedException {
		synchronized (o) {
			while (i != 2) {
				o.wait();
			}
			System.out.println("b");
			i =3;
			o.notifyAll();
		}
	}

	public void printC() throws InterruptedException {
		synchronized (o) {
			while (i != 3) {
				o.wait();
			}
			System.out.println("c");
			i =1;
			o.notifyAll();
		}
	}

	public static void main(String[] args) throws Exception {
		final ThreadABC threadABC = new ThreadABC();
		new Thread(new Runnable() {
			public void run()  {
				try {
					for (int i = 0; i < 10; i++)  {
						threadABC.printA();
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}).start();
		
		new Thread(new Runnable() {
			public void run()  {
				try {
					for (int i = 0; i < 10; i++)  {
						threadABC.printB();
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}).start();
		
		new Thread(new Runnable() {
			public void run()  {
				try {
					for (int i = 0; i < 10; i++)  {
						threadABC.printC();
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}).start();
	}
}

 阻塞队列的实现

package com.cn;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class ThreadABC {
	int i = 1;
	Object o = new Object();
	BlockingQueue<Integer> a = new ArrayBlockingQueue<Integer>(1);
	BlockingQueue<Integer> b = new ArrayBlockingQueue<Integer>(1);
	BlockingQueue<Integer> c = new ArrayBlockingQueue<Integer>(1);
	{
		a.add(1);
	}
	public void printA() throws InterruptedException {
		a.take();
			System.out.println("a");
			b.add(1);
	}

	public void printB() throws InterruptedException {
		b.take();
		System.out.println("b");
		c.add(1);
	}

	public void printC() throws InterruptedException {
		c.take();
		System.out.println("c");
		a.add(1);
	}

	public static void main(String[] args) throws Exception {
		final ThreadABC threadABC = new ThreadABC();
		new Thread(new Runnable() {
			public void run()  {
				try {
					while (true) {
						threadABC.printA();
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}).start();
		
		new Thread(new Runnable() {
			public void run()  {
				try {
					while (true) {
						threadABC.printB();
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}).start();
		
		new Thread(new Runnable() {
			public void run()  {
				try {
					while (true) {
						threadABC.printC();
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}).start();
	}
}

 

 

 

 

分享到:
评论

相关推荐

    java常见面试题---线程篇

    以下是一些关于Java线程的常见面试知识点,这些内容可能出现在线程.doc文档中: 1. **线程的创建方式**: - 实现`Runnable`接口:创建一个类实现`Runnable`接口,并重写`run()`方法,然后将实例传递给`Thread`类的...

    2023黑马面试宝典-Java面试宝典大全-java面试宝典黑马

    4. **多线程**:Java提供了丰富的多线程支持,面试中会考察线程的创建、同步机制(synchronized、Lock)、死锁、线程池等。理解线程状态转换图,掌握线程安全问题的解决方案,如volatile、ThreadLocal等,有助于在...

    面试-Java一些常见面试题+题解之多线程开发-JavaConcurrent.zip

    - Java线程具有优先级,但实际调度很大程度上依赖于操作系统,不保证优先级高的线程优先执行。 10. **中断机制** - Thread类的interrupt()方法用于请求中断线程,isInterrupted()和interrupted()检查中断状态。 ...

    Java面试题资料合集-44套.rar

    java面试-BIO,NIO,AIO,Netty面试题 35道 java面试-Java+最常见的+200++面试题汇总+答案总结汇总 java面试-Java并发编程最全面试题 123道 ...java面试-多线程面试59题(含答案) java面试-设计模式面试题 14道

    01大数据面试复习----Java基础---集合类、多线程、JVM.zip

    在准备大数据面试的过程中,Java基础是必不可少的一部分,尤其聚焦于集合类、多线程和JVM这三大核心领域。下面将分别对这三个方面进行深入探讨。 **一、Java集合类** Java集合框架是处理对象组的重要工具,它包括...

    java私塾面试题----线程和JSP及EJB部分1

    ### Java私塾面试题解析 —— 线程与EJB部分 #### 一、线程编程基础 **1. 实现线程的两种方法及其优缺点** Java中实现线程主要有两种方式: - **继承`Thread`类**:创建一个新的类继承自`Thread`类,并重写`run...

    java-java面试题库整理-基础-JVM-线程并发-框架等.zip

    这份"java-java面试题库整理-基础-JVM-线程并发-框架等.zip"文件提供了一个全面的复习资源,帮助求职者准备Java相关的面试。 1. **Java基础知识** - 类与对象:Java是一种面向对象的语言,了解类的定义、构造器、...

    【Java核心知识面试】-java多线程50题.zip

    以上只是Java多线程部分核心知识点,实际面试中可能还会涉及线程安全、并发工具类(如Semaphore、CountDownLatch、CyclicBarrier)等内容。理解并熟练掌握这些知识对于成为一名优秀的Java开发人员至关重要。

    huawei面试题--java篇

    ### 华为Java面试知识点详解 #### 一、面向对象的特征 面向对象编程的核心特征主要包括以下几个方面: 1. **封装性**:封装是将数据和操作数据的方法绑定在一起作为一个整体,即对象。通过访问控制符(如private...

    73道Java面试题合集-多线程与进程

    以下是对73道Java面试题合集——多线程与进程相关知识点的详细解释。 1. **进程与线程的概念**: - **进程**:是操作系统资源分配的基本单位,拥有独立的内存空间和系统资源,可以并发执行。 - **线程**:是程序...

    java面试——深圳-OPPO-Java高级.zip

    在Java高级面试中,面试官通常会关注应聘者对核心概念、高级特性和实际问题解决能力的掌握。针对“深圳-OPPO-Java高级”这个主题,我们可以预想面试会涵盖多个关键知识点,包括但不限于: 1. **Java基础**: - 类...

    java面试题-java-interview-questions-master.zip

    java面试题_java-interview-questions-master.zip2、在 Java 程序中怎么保证多线程的运行安全? 出现线程安全问题的原因一般都是三个原因: 1、 线程切换带来的原子性问题 解决办法:使用多线程之间同步...

    java私塾面试题----JAVA代码与编程3

    Java私塾面试题----JAVA代码与编程3涵盖了Java编程中的核心知识点,这些是面试官在评估候选人技术能力时经常会问到的问题。以下是一些关键的知识点解析: 1. **基本语法**:Java是一种强类型、面向对象的语言,面试...

    计算机后端-Java-Java高并发从入门到面试教程-课程准备.zip

    在本课程"计算机后端-Java-Java高并发从入门到面试教程-课程准备"中,我们将深入探讨Java编程语言在处理高并发场景下的核心概念和技术。Java是企业级应用开发的重要选择,尤其是在大型分布式系统中,其强大的并发...

    Java面试题-线程多线程.pdf

    Java线程有五种状态:新建(New)、可运行(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)。线程从新建到运行,可能经历 `start()` 调用、调度器的选择以及可能的同步等待。线程状态的转换受到 `...

    java面试题-多线程(含答案).pdf

    java面试题_多线程(含答案).pdf

    计算机后端-Java-Java高并发从入门到面试教程-并发基础.zip

    在Java中,线程安全是一个核心话题。当多个线程访问共享数据时,如果没有正确的同步机制,可能会出现数据不一致的情况,这就是所谓的竞态条件。Java提供了synchronized关键字来实现线程同步,它可以保证同一时间只有...

    计算机后端-Java-Java高并发从入门到面试教程-存思路.zip

    - **Java线程创建**:通过`Thread`类、实现`Runnable`接口或使用`ExecutorService`创建线程。 - **线程同步**:掌握`synchronized`关键字的使用,包括方法同步和代码块同步。 - **死锁**:理解死锁的概念,如何...

    java经典多线程面试题

    - java.util.concurrent包中提供了一些线程安全的集合类,如ConcurrentHashMap、CopyOnWriteArrayList等,这些集合类能够在多线程环境下提供更安全且效率更高的数据操作。 11. Java中ReentrantLock和synchronized...

Global site tag (gtag.js) - Google Analytics