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的差别. ...
随机推荐
- WebSphere,WebLogic,Tomcat,IIS
Weblogic.Tomcat 都基于java的基础架构 Weblogic是一个企业级的应用服务器,其中包括j2ee中的各类应用如jsp,servlet,ejb等, Tomcat是一个初级的应用服务器 ...
- 超哥教你发布CRM
发布CRM你将使用以下软件 nginx uWSGI CentOS7 CRM项目文件 virtualenv supervisor WSGI.uWSGI python web服务器开发使用WSGI协议(W ...
- 事务理解及Spring中的事务
一.隔离级别理解 1.脏读 首先理解,一个事务对数据进行了改变,尽管该事务尚未提交,但此时其他事务中的查询语句(注意一定是处于事务中的语句,不处于事务中的语句查到的是正常的)查到的数据,是该事务修改之 ...
- Linux安装64位Mysql5.7
首先下载mysql 地址:https://dev.mysql.com/downloads/mysql/ 下载社区版mysql 下载完成后:ftp上传到服务器 /user/local/目录下,这个自己定 ...
- c# 抽象类与接口【学习笔记】
最近一直在学着面向接口编程,总是会写出好多的接口然后继承,现在开始发现了一些好处,就是在一个方法里面使用另一个方法的时候, 用接口代替这个被使用的方法,可以减少代码的耦合,后期的扩展也方便,代码易于维 ...
- [多线程] 线程中的synchronized关键字锁
为什么要用锁? 在多线程中,难免会出现在多个线程中对同一个对象的实例变量或者全局静态变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数据其实 ...
- DisplayLink 安装错误
根据 在官网论坛上的反馈结果,程序自己有验证数字签名,数字签名验证不通过,即如上图所示.可能的原因:病毒:下载不完全:证书链出问题
- 在Fiddler中添加自己所需的显示列
有时候我们想了解请求响应的时间.服务器IP等相关信息,Fiddler默认是没有显示的,这个时候就需要我们借助高级用法---自定义显示列, 其实主要就是操作这个文件Fiddler2\Scripts\Cu ...
- C#磁性窗体设计
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- python 参数传递 传值还是传引用
个人推测结论: 可变对象传引用,不可变对象传值 python里的变量不同于c中地址储值模型 a=100 b=100 print(id(a),id(b),a==b,a is b) #8790877986 ...