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的差别. ...
随机推荐
- Win10系列:C#应用控件基础8
ToggleSwitch控件 在应用程序中ToggleSwitch控件可以模拟一个允许用户在启用和禁用两种状态之间进行切换的物理开关,ToggleSwitch控件的功能与我们在日常生活中所使用的电源开 ...
- Python connect mariadb(Python连接mysql)
#!/usr/bin/python#coding=utf-8 import MySQLdb # 打开数据库连接db = MySQLdb.connect("192.168.1.250" ...
- Forth词典条目结构
body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...
- Java EntityMapper
package org.rx.util; import org.rx.common.Func2; import org.rx.common.Action2; import org.rx.common. ...
- vue,在模块中动态添加dom节点,并监听
在这里,onclick事件没有作用,因为它指向的是window,如果写为this.click页面显示为undefined, 我采用的是通过class绑定事件,但是会有一个问题,那就是当你渲染多个事件时 ...
- SpringMVC @RequestBody @RequestParam @PathVariable 等参数绑定注解详解
request 数据到handler method 参数数据的绑定所用到的注解和什么情形下使用: http://blog.csdn.net/walkerjong/article/details/794 ...
- JAVA高级篇(四、JVM垃圾回收和调优)
本文转自https://zhuanlan.zhihu.com/p/25539690 JVM GC(垃圾回收机制) 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会 ...
- Unity Mathf/Math数学运算函数说明全集(Chinar总结)
Unity Mathf 数学函数库 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...
- 软件工程第四次作业 石墨文档IOS
待分析的产品:石墨文档IOS客户端 作业地址: https://edu.cnblogs.com/campus/nenu/2016CS/homework/2505 第一部分 调研, 评测 1.下载并 ...
- 我的代码-cleaning
# coding: utf-8 # In[18]: import pandas as pdimport numpy as npfrom sklearn import treefrom sklearn. ...