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的差别. ...
随机推荐
- 19_04_02校内训练[deadline]
题意 给出一个二分图,左边为A集合,右边为B集合,要求把A集合中每一个点染为黑白两色中的一种,B集合中的颜色已定.染色后对于原本相邻且颜色相同的点,建立新的二分图,即得到了两个新的二分图,它们是独立的 ...
- leetcode python 007
## 翻转整数def evert(int0): if int0<0: flg=1 else: flg=0 e=int(str(int0)[flg: ...
- 如何在Linux上清理内存缓存、缓冲与交换空间
如何在Linux上清理内存缓存.缓冲与交换空间 与其他类型的操作系统一样,GNU/Linux已经有效的实现了内存管理,甚至更加优秀.但是如果任何进程正在吃光你的内存,并且你想清理它,Linux提供了一 ...
- oracle高级分组
基本group by用法 create table test_table(a varchar(20),b varchar(20),c varchar(20)) insert into test_tab ...
- nginx传世经典
nginx的简单介绍与安装nginx的简单介绍 一.Nginx的产生 Nginx是一款高性能的 HTTP 和反向代理服务器,由俄罗斯人Igor Sysoev(伊戈尔·赛索耶夫)为俄罗斯网站Ramble ...
- Echarts X轴 Y轴 线的类型、颜色、及标签字体颜色 设置
// 人均效能 var initRjxnChart = function () { var rjxnChart = echarts.init(document.getElementById(" ...
- 关于第一次在IED(MyEclipse)部署Maven时,pom.xml头部报这样的错---org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.MavenProject, org.apache.maven.archiver.MavenArchiveConfiguration)
rg.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.MavenProject, org.apache ...
- 【持续更新】 | OpenCV 学习笔记
本文地址:http://www.cnblogs.com/QingHuan/p/7365732.html,转载请注明出处 ######################################## ...
- 读书笔记--《gongchandang宣言》
纪念马克思诞辰200周年 末尾 gongchandang人不屑于隐瞒自己的观点和意图.他们公开宣布:他们的目的只有用暴力推翻全部现存的社会制度才能达到. 让统治接机在共产主义革命面前发抖吧. 无产者在 ...
- PHP 框架
LARAVEL/LUMEN, CI ,THINKPHP, YII ,SYMFONY YAF, PHALCON ,ICE FRAMEWORK