面试题目——《CC150》线程与锁


package cc150.thread_lock;
public class RunnableThreadExample implements Runnable{
public int count = 0;
public static void main(String[] args) {
// TODO 自动生成的方法存根
RunnableThreadExample instance = new RunnableThreadExample();
Thread thread = new Thread(instance);
thread.start();
//等到上面的线程数到5
while(instance.count != 5){
try{
Thread.sleep(250);
System.out.println("等待");
}catch(InterruptedException exc){
exc.printStackTrace();
}
}
}
@Override
public void run() {
// TODO 自动生成的方法存根
System.out.println("RunnableThread开始");
try{
while(count < 5){
Thread.sleep(500);
count++;
}
}catch(InterruptedException exc){
System.out.println("RunnableThread中断");
}
System.out.println("RunnableThread终止");
}
}

package cc150.thread_lock;
public class ThreadExample{
public static void main(String[] args){
// TODO 自动生成的方法存根
ThreadExample th = new ThreadExample();
threadExample instance = th.new threadExample();
instance.start();
//等到上面的线程数到5
while(instance.count != 5){
try{
Thread.sleep(250);
System.out.println("等待");
}catch(InterruptedException exc){
exc.printStackTrace();
}
}
}
public class threadExample extends Thread{
int count = 0;
public void run() {
// TODO 自动生成的方法存根
System.out.println("Thread开始");
try{
while(count < 5){
Thread.sleep(500);
System.out.println("在线程中,count是"+count);
count++;
}
}catch(InterruptedException exc){
System.out.println("RunnableThread中断");
}
System.out.println("RunnableThread终止");
}
}
}


package cc150.thread_lock;
class MyObject{
public synchronized void foo(String name){ //加上synchronized关键字,给foo提供同步
try{
System.out.println("线程"+name+".foo()开始");
Thread.sleep(3000);
System.out.println("线程"+name+".foo()结束");
}catch(InterruptedException exc){
System.out.println("线程"+name+"中断");
}
}
}
public class MyClass extends Thread{ //不同的线程,来调用上面的foo
private String name;
private MyObject myObj;
public MyClass(MyObject obj,String n){
name = n;
myObj = obj;
}
public void run(){
myObj.foo(name);
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
// MyObject obj1 = new MyObject();
// MyObject obj2 = new MyObject();
// MyClass thread1 = new MyClass(obj1,"1");
// MyClass thread2 = new MyClass(obj2,"2");
// thread1.start();
// thread2.start();
//相同的obj引用,只能一个线程可以调用foo,另一个线程必须等待
MyObject obj = new MyObject();
MyClass thread11 = new MyClass(obj,"1");
MyClass thread22 = new MyClass(obj,"2");
thread11.start();
thread22.start();
}
}

package cc150.thread_lock;
class MyObject{
public static synchronized void foo(String name){ //加上synchronized关键字,给foo提供同步
try{
System.out.println("线程"+name+".foo()开始");
Thread.sleep(3000);
System.out.println("线程"+name+".foo()结束");
}catch(InterruptedException exc){
System.out.println("线程"+name+"中断");
}
}
public static synchronized void bar(String name){ //加上synchronized关键字,给bar提供同步
try{
System.out.println("线程"+name+".bar()开始");
Thread.sleep(3000);
System.out.println("线程"+name+".bar()结束");
}catch(InterruptedException exc){
System.out.println("线程"+name+"中断");
}
}
}
public class MyClass extends Thread{ //不同的线程,来调用上面的foo
private String name;
private MyObject myObj;
public MyClass(MyObject obj,String n){
name = n;
myObj = obj;
}
public void run(){
//myObj.foo(name);
if(name.equals("1"))
MyObject.foo(name);
else if(name.equals("2"))
MyObject.bar(name);
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
// MyObject obj1 = new MyObject();
// MyObject obj2 = new MyObject();
// MyClass thread1 = new MyClass(obj1,"1");
// MyClass thread2 = new MyClass(obj2,"2");
// thread1.start();
// thread2.start();
//相同的obj引用,只能一个线程可以调用foo,另一个线程必须等待
MyObject obj = new MyObject();
MyClass thread11 = new MyClass(obj,"1");
MyClass thread22 = new MyClass(obj,"2");
thread11.start();
thread22.start();
}
}

package cc150.thread_lock;
class MyObject2{
public synchronized void foo(String name){ //加上synchronized块,给foo提供同步
synchronized(this){
try{
System.out.println("线程"+name+".foo()开始");
Thread.sleep(3000);
System.out.println("线程"+name+".foo()结束");
}catch(InterruptedException exc){
System.out.println("线程"+name+"中断");
}
}
}
}
public class MyClass2 extends Thread{ //不同的线程,来调用上面的foo
private String name;
private MyObject2 myObj;
public MyClass2(MyObject2 obj,String n){
name = n;
myObj = obj;
}
public void run(){
myObj.foo(name);
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
// MyObject obj1 = new MyObject();
// MyObject obj2 = new MyObject();
// MyClass thread1 = new MyClass(obj1,"1");
// MyClass thread2 = new MyClass(obj2,"2");
// thread1.start();
// thread2.start();
//相同的obj引用,只能一个线程可以调用foo,另一个线程必须等待
MyObject2 obj = new MyObject2();
MyClass2 thread11 = new MyClass2(obj,"1");
MyClass2 thread22 = new MyClass2(obj,"2");
thread11.start();
thread22.start();
}
}

package cc150.thread_lock; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; class MyObj { private Lock lock;
private int balance = 100; //剩余 public MyObj(){ //构造函数
lock = new ReentrantLock(); //可重入锁
} public int withdraw(int value){ //取款
lock.lock();
int temp = balance;
try{
Thread.sleep(100);
temp = temp-value;
Thread.sleep(100);
balance = temp;
}catch(InterruptedException e){ }
lock.unlock();
return temp;
} public int deposit(int value){ //存款
lock.lock();
int temp = balance;
try{
Thread.sleep(100);
temp = temp+value;
Thread.sleep(100);
balance = temp;
}catch(InterruptedException e){ }
lock.unlock();
return temp;
}
} public class LockedATM extends Thread{ private int value;
private MyObj myObj;
private String str; public LockedATM(MyObj obj,String s,int v){
value = v;
myObj = obj;
str = s;
} public void run(){
if(str.equals("withdraw"))
System.out.println(myObj.withdraw(value));
else if(str.equals("deposit"))
System.out.println(myObj.deposit(value));
} public static void main(String[] args) {
// TODO 自动生成的方法存根
MyObj obj1 = new MyObj();
MyObj obj2 = new MyObj();
LockedATM thread1 = new LockedATM(obj1,"withdraw",50); //两个线程执行的顺序不一定
LockedATM thread2 = new LockedATM(obj2,"deposit",50); //可能先存款,也可能先取款
thread1.start();
thread2.start();
}
}




面试题目——《CC150》线程与锁的更多相关文章
- 最新天猫3轮面试题目:虚拟机+并发锁+Sql防注入+Zookeeper
天猫一面 自我介绍.项目介绍 Spring拦截器.实现了哪些方法?底层原理 AOP如何配置,底层原理.2种动态代理,aop注解实现,xml定义切面 Bean的作用域,单例模式是否线程安全?恶汉模式是否 ...
- 字节跳动Java研发面试99题(含答案):JVM+Spring+MySQL+线程池+锁
JVM的内存结构 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 1. Java虚拟机栈:线程私有:每个方法在执行的时候会创建一个栈帧,存储了局部变量表, ...
- 《Cracking the Coding Interview》——第16章:线程与锁——题目1
2014-04-27 19:09 题目:线程和进程有什么区别? 解法:理论题,操作系统教材上应该有很详细的解释.我回忆了一下,写了如下几点. 代码: // 16.1 What is the diffe ...
- PHP面试题目搜集
搜集这些题目是想在学习PHP方面知识有更感性的认识,单纯看书的话会很容易看后就忘记. 曾经看过数据结构.设计模式.HTTP等方面的书籍,但是基本看完后就是看完了,没有然后了,随着时间的推移,也就渐渐忘 ...
- (转)喜马拉雅2018 Java面试题目
背景:将网上的题目整理下. java基础 1:hashTable hashMap ConcurrentHashMap 的区别.数据结构.线程安全 2:equals和==区别, 重写equals一定要重 ...
- C++程序员面试题目总结(涉及C++基础、多线程多进程、网络编程、数据结构与算法)
说明:C++程序员面试题目总结(涉及C++基础知识.多线程多进程.TCP/IP网络编程.Linux操作.数据结构与算法) 内容来自作者看过的帖子或者看过的文章,个人整理自互联网,如有侵权,请联系作者 ...
- java常见面试题目(一)
在大四实习阶段,秋招的时候,面试了很多家公司,总结常见的java面试题目:(答案可以自己百度) 1.你所用oracle的版本号是多少? 2.tomcat修改8080端口号的配置文件是哪个? 3.myb ...
- 全网最全C#实习面试题目
整个内容是我在春招面试时候整理的一些题目,里面涵盖有网上搬运的(由于当时没有记录来源,如果有转载没标注来源,请与我联系),还有我面试到的.整个排版很乱,后期我会一步一步整理.整个内容大概快有两万字.整 ...
- 2020阿里Java面试题目大汇总,看看你离阿里还有多远,附答案!
前言 首先说一下情况,我大概我是从去年12月份开始看书学习,到今年的6月份,一直学到看大家的面经基本上百分之90以上都会,我就在5月份开始投简历,边面试边补充基础知识等.也是有些辛苦.终于是在前不久拿 ...
- 33条C#、.Net经典面试题目及答案
33条C#..Net经典面试题目及答案[zt] 本文集中了多条常见的C#..Net经典面试题目例如".NET中类和结构的区别"."ASP.NET页面之间传递值的几种方式? ...
随机推荐
- 问题解决——MFC error RC2170: bitmap file res\XXXXXXX.png is not in 3.00 format
=================================版权声明================================= 版权声明:原创文章 谢绝转载 请通过右侧公告中的“联系邮 ...
- OpenStack 架构 - 每天5分钟玩转 OpenStack(15)
终于正式进入 OpenStack 部分了. 今天开始,CloudMan 将带着大家一步一步揭开 OpenStack 的神秘面纱. OpenStack 已经走过了 6 个年头. 每半年会发布一个版本,版 ...
- js鼠标滚轮事件
不多说,直接上代码. //非ie document.body.onmousewheel = function(event) { event = event || window.event; conso ...
- Java报表工具FineReport导出EXCEL的四种API
在实际的应用中会经常需要将数据导出成excel,导出的方式除原样导出还有分页导出.分页分sheet导出和大数据量导出.对于excel 2003版,由于限制了每个sheet的最大行数和列数,大数据量导出 ...
- python学习笔记-python解释器
刚开始学习python,首先要了解一下python解释器. 什么是python解释器? 编写python代码保存后,我们会得到一个以.py为扩展名的文本文件.要运行此文件,就需要python解释器去执 ...
- Java JDBC基础学习小结
JDBC是一个Java应用程序接口,作用是封装了对数据库的各种操作.JDBC由类和接口组成,使用Java开发数据库应用都需要4个主要的接口:Driver.Connection.Statement.Re ...
- POJ1962Corporative Network[带权并查集]
Corporative Network Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 3945 Accepted: 14 ...
- Hibernate组件映射
Hibernate联合主键映射以及组件映射 在Hibernate中联合主键的形成有两种可能:一种是由多对多映射形成的,多对多映射会形成第三张表,一般来说第三张表的主键是由其他两张表的主键构成的(比如学 ...
- 学习C++.Primer.Plus 10 对象和类
1.类的声明和定义 类的声明和定义. 类声明的格式如下: class className { private://private 是类对象的默认访问控制,因此,可以省略 data member del ...
- 写Java也得了解CPU--伪共享
第一次接触伪共享的概念,是在马丁的博客上:而ifeve也把这一系列博文翻译整理好了.概读了几次,感觉到此概念的重要.因此有了这个系列的第二篇读后总结. 1. 什么是伪共享(False sharing) ...