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的差别. ...
随机推荐
- 微服务-开发框架之springboot by 大雄daysn
目录 一.关于springboot 二.springboot的实践 2.1发布一个rest的api 2.2端点 2.3健康检查 2.4远程监控 一.关于springboot 由来:spring1.0- ...
- docker-compose docker启动工具,容器互联
简介: docker可以一条命令就运行一个配置好的服务器,很是方便. 但是也有一个问题就是,当参数比较多,映射目录比较多,映射端口比较多………… 我以前就是写个脚本,用脚本来启动,很low啊. 也见到 ...
- Django--filter(**kwargs)
Django--filter(**kwargs)-exclude(**kwargs) filter() 说明: 数据的过滤 返回Queryset包含与给定查找参数匹配的新对象.这里需要特别注意的地方就 ...
- Linux中实现文本过滤
alias命令 功能:设置指令的别名 语法:alias [别名]=[指令名称] 参数:若不加任何参数,则列出所有别名的设置 说明:alias仅作用于当前登录的shell.若要永久使用别名,可在/etc ...
- jq demo 九宫格抽奖
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- SQL-61 对于employees表中,给出奇数行的first_name
题目描述 对于employees表中,给出奇数行的first_nameCREATE TABLE `employees` (`emp_no` int(11) NOT NULL,`birth_date` ...
- SEH X86
( windows 提供的异常处理机制实际上只是一个简单的框架,一般情况下开发人员都不会直接用到.我们通常所用的异常处理(比如 C++ 的 throw.try.catch)都是编译器在系统提供的异常处 ...
- 最短路,floyd算法,图的最短路径
题目描述: 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线 ...
- JAVA学习笔记系列1-Java版本介绍
JavaSE(Java Standard Edition):标准版,定位在个人计算机上的应用(桌面应用).因为一般都是Windows系统,因此Java的这个发展并不好. JavaEE(Java Ent ...
- 如何使用HackRF做一个简单的IMSI捕获器
关于IMSI IMSI为国际用户识别码(International Mobile Subscriber Identity)的缩写,是用于区分蜂窝网络中不同用户的,在所在蜂窝网络中不重复的识别码.IMS ...