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》线程与锁的更多相关文章

  1. 最新天猫3轮面试题目:虚拟机+并发锁+Sql防注入+Zookeeper

    天猫一面 自我介绍.项目介绍 Spring拦截器.实现了哪些方法?底层原理 AOP如何配置,底层原理.2种动态代理,aop注解实现,xml定义切面 Bean的作用域,单例模式是否线程安全?恶汉模式是否 ...

  2. 字节跳动Java研发面试99题(含答案):JVM+Spring+MySQL+线程池+锁

    JVM的内存结构 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 1. Java虚拟机栈:线程私有:每个方法在执行的时候会创建一个栈帧,存储了局部变量表, ...

  3. 《Cracking the Coding Interview》——第16章:线程与锁——题目1

    2014-04-27 19:09 题目:线程和进程有什么区别? 解法:理论题,操作系统教材上应该有很详细的解释.我回忆了一下,写了如下几点. 代码: // 16.1 What is the diffe ...

  4. PHP面试题目搜集

    搜集这些题目是想在学习PHP方面知识有更感性的认识,单纯看书的话会很容易看后就忘记. 曾经看过数据结构.设计模式.HTTP等方面的书籍,但是基本看完后就是看完了,没有然后了,随着时间的推移,也就渐渐忘 ...

  5. (转)喜马拉雅2018 Java面试题目

    背景:将网上的题目整理下. java基础 1:hashTable hashMap ConcurrentHashMap 的区别.数据结构.线程安全 2:equals和==区别, 重写equals一定要重 ...

  6. C++程序员面试题目总结(涉及C++基础、多线程多进程、网络编程、数据结构与算法)

     说明:C++程序员面试题目总结(涉及C++基础知识.多线程多进程.TCP/IP网络编程.Linux操作.数据结构与算法) 内容来自作者看过的帖子或者看过的文章,个人整理自互联网,如有侵权,请联系作者 ...

  7. java常见面试题目(一)

    在大四实习阶段,秋招的时候,面试了很多家公司,总结常见的java面试题目:(答案可以自己百度) 1.你所用oracle的版本号是多少? 2.tomcat修改8080端口号的配置文件是哪个? 3.myb ...

  8. 全网最全C#实习面试题目

    整个内容是我在春招面试时候整理的一些题目,里面涵盖有网上搬运的(由于当时没有记录来源,如果有转载没标注来源,请与我联系),还有我面试到的.整个排版很乱,后期我会一步一步整理.整个内容大概快有两万字.整 ...

  9. 2020阿里Java面试题目大汇总,看看你离阿里还有多远,附答案!

    前言 首先说一下情况,我大概我是从去年12月份开始看书学习,到今年的6月份,一直学到看大家的面经基本上百分之90以上都会,我就在5月份开始投简历,边面试边补充基础知识等.也是有些辛苦.终于是在前不久拿 ...

  10. 33条C#、.Net经典面试题目及答案

    33条C#..Net经典面试题目及答案[zt] 本文集中了多条常见的C#..Net经典面试题目例如".NET中类和结构的区别"."ASP.NET页面之间传递值的几种方式? ...

随机推荐

  1. Linux下监控服务器状态命令——top

    ----------------------------------工作中常用的命令,来判断服务器状态是否正常------------------------------------- top命令作用 ...

  2. [经验]Textbox 做日志记录,

    private void Log(string msg) { txtLog.MaxLength = ; txtLog.AppendText(msg); } 起因:在Winform中用Textbox显示 ...

  3. java中设置代理的两种方式

    1 前言 有时候我们的程序中要提供可以使用代理访问网络,代理的方式包括http.https.ftp.socks代理.比如在IE浏览器设置代理. 那我们在我们的java程序中使用代理呢,有如下两种方式. ...

  4. 漫谈C++11 Thread库之原子操作

    我在之前一篇博文<漫谈C++11 Thread库之使写多线程程序>中,着重介绍了<thread>头文件中的std::thread类以及其上的一些基本操作,至此我们动手写多线程程 ...

  5. 跨云应用部署第一步:使用IPSEC VPN连接AWS中国版和Windows Azure中国版

    随着公有云的普及,越来越多的客户将关键应用迁移到云端.但是事实证明,没有哪家云服务提供商可以提供100%的SLA,无论是例行维护还是意外中断服务,对于客户的关键应用而言,都会受到不同程度的影响.此外, ...

  6. TCP/IP四层模型和OSI七层模型

    TCP/IP四层模型 TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇.TCP/IP协议簇分为四层,IP位于协议簇的第二层(对应OSI的第三层),TCP位于协议簇的第三层(对 ...

  7. python高级之操作数据库

    python高级之操作数据库 本节内容 pymysql介绍及安装 使用pymysql执行sql 获取新建数据自增ID fetch数据类型设置 1.pymysql介绍及安装 在python2中连接数据库 ...

  8. BroadcastReceiver详解

    详解 2014-08-20 19:42 13492人阅读 评论(8) 收藏 举报 分类: 5.andriod开发(148) 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+] ...

  9. PAT 1032. 挖掘机技术哪家强(20)

    为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第1行给出不超过105的正整数N,即参赛人数.随后N行,每行给出一位 ...

  10. Python list

    序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. Python有6个序列的内置类型,但最常见的是列表和元组. 序列 ...