Java笔试面试题整理第五波
转载至:http://blog.csdn.net/shakespeare001/article/details/51321498
作者:山代王(开心阳)
本系列整理Java相关的笔试面试知识点,其他几篇文章如下:
1、实现多线程的两种方法
- public class MyThread extends Thread {
- private static int COUNT = 5;
- private int ticket = COUNT;
- private String name;
- public MyThread(String s){
- name = s;
- }
- @Override
- public void run() {
- for(int i = 0; i < COUNT; i++){
- if(ticket > 0){
- System.out.println(name + ”–>” + ticket–);
- }
- }
- }

public class MyThread extends Thread {
private static int COUNT = 5;
private int ticket = COUNT;
private String name;
public MyThread(String s){
name = s;
}
@Override
public void run() {
for(int i = 0; i < COUNT; i++){
if(ticket > 0){
System.out.println(name + "-->" + ticket--);
}
}
}
- MyThread thread1 = new MyThread(“thread1”);
- MyThread thread2 = new MyThread(“thread2”);
- thread1.start();
- thread2.start();

MyThread thread1 = new MyThread("thread1");
MyThread thread2 = new MyThread("thread2");
thread1.start();
thread2.start();
- public class MyRunnable implements Runnable {
- private static int COUNT = 5;
- private int ticket = COUNT;
- @Override
- public void run() {
- for(int i = 0; i < COUNT; i++){
- if(ticket > 0){
- System.out.println(”ticket–>” + ticket–);
- }
- }
- }
- }

public class MyRunnable implements Runnable {
private static int COUNT = 5;
private int ticket = COUNT; @Override
public void run() {
for(int i = 0; i < COUNT; i++){
if(ticket > 0){
System.out.println("ticket-->" + ticket--);
}
}
}
}
- MyRunnable runnable = new MyRunnable();
- new Thread(runnable).start();
- new Thread(runnable).start();

MyRunnable runnable = new MyRunnable();
new Thread(runnable).start();
new Thread(runnable).start();
2、访问控制修饰符(新补充)
- public int compareTo(String anotherString) {
- int len1 = value.length;
- int len2 = anotherString.value.length; //重点是这里!!!
- int lim = Math.min(len1, len2);
- char v1[] = value;
- char v2[] = anotherString.value; //重点是这里!!!
- int k = 0;
- while (k < lim) {
- char c1 = v1[k];
- char c2 = v2[k];
- if (c1 != c2) {
- return c1 - c2;
- }
- k++;
- }
- return len1 - len2;
- }

public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length; //重点是这里!!!
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value; //重点是这里!!! int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
3、线程同步的方法
- public class BankCount {
- private int count = 0;//余额
- public void addMoney(int money){//存钱
- count += money;
- System.out.println(System.currentTimeMillis() + ”存入:” + money);
- System.out.println(”账户余额:” + count);
- }
- public void getMoney(int money){//取钱
- if(count - money < 0){
- System.out.println(”余额不足”);
- System.out.println(”账户余额:” + count);
- return;
- }
- count -= money;
- System.out.println(System.currentTimeMillis() + ”取出:” + money);
- System.out.println(”账户余额:” + count);
- }
- }

public class BankCount {
private int count = 0;//余额 public void addMoney(int money){//存钱
count += money;
System.out.println(System.currentTimeMillis() + "存入:" + money);
System.out.println("账户余额:" + count);
} public void getMoney(int money){//取钱
if(count - money < 0){
System.out.println("余额不足");
System.out.println("账户余额:" + count);
return;
}
count -= money;
System.out.println(System.currentTimeMillis() + "取出:" + money);
System.out.println("账户余额:" + count);
}
}
- public class BankTest {
- public static void main(String[] args) {
- final BankCount bankCount = new BankCount();
- new Thread(new Runnable() {//取钱线程
- @Override
- public void run() {
- while(true){
- bankCount.getMoney(200);
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }).start();
- new Thread(new Runnable() {//存钱线程
- @Override
- public void run() {
- while(true){
- bankCount.addMoney(200);
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }).start();
- }
- }

public class BankTest {
public static void main(String[] args) {
final BankCount bankCount = new BankCount();
new Thread(new Runnable() {//取钱线程
@Override
public void run() {
while(true){
bankCount.getMoney(200);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start(); new Thread(new Runnable() {//存钱线程
@Override
public void run() {
while(true){
bankCount.addMoney(200);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
- public synchronized void addMoney(int money){//存钱
- count += money;
- System.out.println(System.currentTimeMillis() + ”存入:” + money);
- System.out.println(”账户余额:” + count);
- }
- public synchronized void getMoney(int money){//取钱
- if(count - money < 0){
- System.out.println(”余额不足”);
- System.out.println(”账户余额:” + count);
- return;
- }
- count -= money;
- System.out.println(System.currentTimeMillis() + ”取出:” + money);
- System.out.println(”账户余额:” + count);
- }

public synchronized void addMoney(int money){//存钱
count += money;
System.out.println(System.currentTimeMillis() + "存入:" + money);
System.out.println("账户余额:" + count);
} public synchronized void getMoney(int money){//取钱
if(count - money < 0){
System.out.println("余额不足");
System.out.println("账户余额:" + count);
return;
}
count -= money;
System.out.println(System.currentTimeMillis() + "取出:" + money);
System.out.println("账户余额:" + count);
}
- public void addMoney(int money){//存钱
- synchronized(this){
- count += money;
- System.out.println(System.currentTimeMillis() + ”存入:” + money);
- System.out.println(”账户余额:” + count);
- }
- }
- public void getMoney(int money){//取钱
- synchronized(this){
- if(count - money < 0){
- System.out.println(”余额不足”);
- System.out.println(”账户余额:” + count);
- return;
- }
- count -= money;
- System.out.println(System.currentTimeMillis() + ”取出:” + money);
- System.out.println(”账户余额:” + count);
- }
- }

public void addMoney(int money){//存钱
synchronized(this){
count += money;
System.out.println(System.currentTimeMillis() + "存入:" + money);
System.out.println("账户余额:" + count);
}
} public void getMoney(int money){//取钱
synchronized(this){
if(count - money < 0){
System.out.println("余额不足");
System.out.println("账户余额:" + count);
return;
}
count -= money;
System.out.println(System.currentTimeMillis() + "取出:" + money);
System.out.println("账户余额:" + count);
}
}
- public class BankCount {
- private Lock lock = new ReentrantLock();//获取可重入锁
- private int count = 0;//余额
- public void addMoney(int money){//存钱
- lock.lock();
- try {
- count += money;
- System.out.println(System.currentTimeMillis() + ”存入:” + money);
- System.out.println(”账户余额:” + count);
- }finally{
- lock.unlock();
- }
- }
- public void getMoney(int money){//取钱
- lock.lock();
- try {
- if(count - money < 0){
- System.out.println(”余额不足”);
- System.out.println(”账户余额:” + count);
- return;
- }
- count -= money;
- System.out.println(System.currentTimeMillis() + ”取出:” + money);
- System.out.println(”账户余额:” + count);
- } finally{
- lock.unlock();
- }
- }
- }

public class BankCount {
private Lock lock = new ReentrantLock();//获取可重入锁
private int count = 0;//余额 public void addMoney(int money){//存钱
lock.lock();
try {
count += money;
System.out.println(System.currentTimeMillis() + "存入:" + money);
System.out.println("账户余额:" + count);
}finally{
lock.unlock();
}
} public void getMoney(int money){//取钱
lock.lock();
try {
if(count - money < 0){
System.out.println("余额不足");
System.out.println("账户余额:" + count);
return;
}
count -= money;
System.out.println(System.currentTimeMillis() + "取出:" + money);
System.out.println("账户余额:" + count);
} finally{
lock.unlock();
}
}
}
b.使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新
c.因此每次使用该变量就要重新计算,直接从内存中获取,而不是使用寄存器中的值
d.volatile不会提供任何原子操作,它也不能用来修饰final类型的变量。
- public class BankCount {
- private volatile int count = 0;//余额
- public void addMoney(int money){//存钱
- count += money;
- System.out.println(System.currentTimeMillis() + ”存入:” + money);
- System.out.println(”账户余额:” + count);
- }
- public void getMoney(int money){//取钱
- if(count - money < 0){
- System.out.println(”余额不足”);
- System.out.println(”账户余额:” + count);
- return;
- }
- count -= money;
- System.out.println(System.currentTimeMillis() + ”取出:” + money);
- System.out.println(”账户余额:” + count);
- }
- }

public class BankCount {
private volatile int count = 0;//余额 public void addMoney(int money){//存钱
count += money;
System.out.println(System.currentTimeMillis() + "存入:" + money);
System.out.println("账户余额:" + count);
} public void getMoney(int money){//取钱
if(count - money < 0){
System.out.println("余额不足");
System.out.println("账户余额:" + count);
return;
}
count -= money;
System.out.println(System.currentTimeMillis() + "取出:" + money);
System.out.println("账户余额:" + count);
}
}
- public class BankCount {
- private static ThreadLocal<Integer> count = new ThreadLocal<Integer>(){
- protected Integer initialValue() {
- return 0;
- };
- };//余额
- public void addMoney(int money){//存钱
- count.set(count.get() + money);
- System.out.println(System.currentTimeMillis() + ”存入:” + money);
- System.out.println(”账户余额:” + count.get());
- }
- public void getMoney(int money){//取钱
- if(count.get() - money < 0){
- System.out.println(”余额不足”);
- System.out.println(”账户余额:” + count.get());
- return;
- }
- count.set(count.get() - money);
- System.out.println(System.currentTimeMillis() + ”取出:” + money);
- System.out.println(”账户余额:” + count.get());
- }
- }

public class BankCount {
private static ThreadLocal<Integer> count = new ThreadLocal<Integer>(){
protected Integer initialValue() {
return 0;
};
};//余额 public void addMoney(int money){//存钱
count.set(count.get() + money);
System.out.println(System.currentTimeMillis() + "存入:" + money);
System.out.println("账户余额:" + count.get());
} public void getMoney(int money){//取钱
if(count.get() - money < 0){
System.out.println("余额不足");
System.out.println("账户余额:" + count.get());
return;
}
count.set(count.get() - money);
System.out.println(System.currentTimeMillis() + "取出:" + money);
System.out.println("账户余额:" + count.get());
}
}
1、hreadLocal和其它所有的同步机制都是为了解决多线程中的对同一变量的访问冲突,在普通的同步机制中,是通过对象加锁来实现多个线程对同一变量的安全访问的。这时该变量是多个线程共享的,使用这种同步机制需要很细致地分析在什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放该对象的锁等等很多。所有这些都是因为多个线程共享了资源造成的。
4、锁的等级:方法锁、对象锁、类锁
- public class BankCount {
- public synchronized void addMoney(int money){//存钱
- synchronized(this){ //同步代码块
- int i = 5;
- while(i– > 0){
- System.out.println(Thread.currentThread().getName() + ”>存入:” + money);
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
- public synchronized void getMoney(int money){//取钱
- int i = 5;
- while(i– > 0){
- System.out.println(Thread.currentThread().getName() + ”>取钱:” + money);
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }

public class BankCount {
public synchronized void addMoney(int money){//存钱
synchronized(this){ //同步代码块
int i = 5;
while(i-- > 0){
System.out.println(Thread.currentThread().getName() + ">存入:" + money);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} public synchronized void getMoney(int money){//取钱
int i = 5;
while(i-- > 0){
System.out.println(Thread.currentThread().getName() + ">取钱:" + money);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
- public class BankTest {
- public static void main(String[] args) {
- final BankCount bankCount = new BankCount();
- new Thread(new Runnable() {//取钱线程
- @Override
- public void run() {
- bankCount.getMoney(200);
- }
- },”取钱线程”).start();
- new Thread(new Runnable() {//存钱线程
- @Override
- public void run() {
- bankCount.addMoney(200);
- }
- },”存钱线程”).start();
- }
- }

public class BankTest {
public static void main(String[] args) {
final BankCount bankCount = new BankCount();
new Thread(new Runnable() {//取钱线程
@Override
public void run() {
bankCount.getMoney(200);
}
},"取钱线程").start(); new Thread(new Runnable() {//存钱线程
@Override
public void run() {
bankCount.addMoney(200);
}
},"存钱线程").start();
}
}
- public void addMoney(int money){//存钱
- synchronized(BankCount.class){
- int i = 5;
- while(i– > 0){
- System.out.println(Thread.currentThread().getName() + ”>存入:” + money);
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
- public static synchronized void getMoney(int money){//取钱
- int i = 5;
- while(i– > 0){
- System.out.println(Thread.currentThread().getName() + ”>取钱:” + money);
- try {
- Thread.sleep(500);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }

public void addMoney(int money){//存钱
synchronized(BankCount.class){
int i = 5;
while(i-- > 0){
System.out.println(Thread.currentThread().getName() + ">存入:" + money);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} public static synchronized void getMoney(int money){//取钱
int i = 5;
while(i-- > 0){
System.out.println(Thread.currentThread().getName() + ">取钱:" + money);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Java笔试面试题整理第五波的更多相关文章
- Java笔试面试题整理第八波
转载至:http://blog.csdn.net/shakespeare001/article/details/51388516 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...
- Java笔试面试题整理第六波(修正版)
转载至:http://blog.csdn.net/shakespeare001/article/details/51330745 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...
- Java笔试面试题整理第四波
转载至:http://blog.csdn.net/shakespeare001/article/details/51274685 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...
- Java笔试面试题整理第七波
转载至:http://blog.csdn.net/shakespeare001/article/details/51388516 作者:山代王(开心阳) 1.super的作用 在Java中su ...
- Java笔试面试题整理第三波
转载至:http://blog.csdn.net/shakespeare001/article/details/51247785 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...
- Java笔试面试题整理第二波
转载至:http://blog.csdn.net/shakespeare001/article/details/51200163 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...
- Java笔试面试题整理第一波
转载至:http://blog.csdn.net/shakespeare001/article/details/51151650 作者:山代王(开心阳) 本系列整理Java相关的笔试面试知识点,其他几 ...
- Java工程师笔试题整理[校招篇]
Java工程师笔试题整理[校招篇] 隔着两个月即将开始校招了.你是不是也想借着这个机会崭露头角,拿到某些大厂的offer,赢取白富美.走上人生巅峰?当然如果你还没能打下Java基础,一定要先打 ...
- Java笔试面试题007
Java笔试面试题007 1.请用正則表達式匹配出QQ号(如果QQ号码为5-10位). 解答: ^ \d{5,10}$ 2.String, StringBuffer StringBuilder的差别. ...
随机推荐
- 密码机制(PGP)
01 PGP概念 02 PGP认证加密体系
- keepalived高可用集群。
keepalived故障切换转移原理1vrrp协议:(vritual router redundancy protocol)虚拟路由冗余协议,2故障转移.keepalived三大功能1实现物理高可用, ...
- [Codeforces440D]Berland Federalization
Problem 给你一棵树,最少删掉哪些边,能使得余下的至少有1个大小刚好为k的残树. 1 ≤ k ≤ n ≤ 400 Solution 用f[i][j]表示以i为根有j个节点的最少删边数量 因为此题 ...
- MCNN多层神经网络论文笔记
论文原文 https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/Zhang_Single-Image_Crowd_Coun ...
- redis-cluster配置
为什么要用redis-cluster 1.并发问题 redis官方生成可以达到 10万/每秒,每秒执行10万条命令假如业务需要每秒100万的命令执行呢? 2.数据量太大 一台服务器内存正常是16~25 ...
- python3入门教程(二)操作数据库(一)
概述 最近在准备写一个爬虫的练手项目,基本想法是把某新闻网站的内容分类爬取下来,保存至数据库,再通过接口对外输出(提供后台查询接口).那么问题就来了,python到底是怎么去操作数据库的呢?我们今天就 ...
- 理解linux下的load
我们在做Linux负载计算的时候,我们需要了解负载的几个概念 1)Linux负载是什么 2)Linux负载怎么计算 3)如何区分目前负载是“好”还是“坏” 4)什么时候应该注意哪些不正常的值 1) ...
- Jsの数组练习-求一组数中的最大值和最小值,以及所在位置
要求:求一组数中的最大值和最小值,以及所在位置 代码实现: <!DOCTYPE html> <html lang="en"> <head> &l ...
- python基础提高演练(名片管理系统的开发)
综合应用 —— 名片管理系统 目标 综合应用已经学习过的知识点: 变量 流程控制 函数 模块 开发 名片管理系统 系统需求 1. 程序启动,显示名片管理系统欢迎界面,并显示功能菜单 ********* ...
- [转] Ubuntu16.04完美安装Sublime text3
转载自:https://www.cnblogs.com/hupeng1234/p/6957623.html 1.安装方法 1)使用ppa安装 sudo add-apt-repository ppa:w ...