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. W3School-CSS 外边距 (margin) 实例

    CSS 外边距 (margin) 实例 CSS 实例 CSS 背景实例 CSS 文本实例 CSS 字体(font)实例 CSS 边框(border)实例 CSS 外边距 (margin) 实例 CSS ...

  2. java实现基于activeMQ的消息推送

    一. 准备工作 1. 点击此下载相关的第三方jar包,并在工程中引用 二. spring配置文件:application.xml <?xml version="1.0" en ...

  3. Forbidden You don't have permission to access / on this server PHP

    在新安装的谷歌游览器里,打不了PHP网站了,错误显示: Forbidden You don't have permission to access / on this server. 原因还是配置权限 ...

  4. openstack-swift云存储部署(一)

    最近因为工作的需要搭建了一套swift云存储架构 我们先来解读一下里面的技术知识点:swift服务是属于openstack中的一种组件服务,openstack中的组件服务还有keystone.Nova ...

  5. Tomcat关闭日志catalina.out

    catalina.out文件会越来越大,对系统的稳定造成了一定的影响.conf/logging.properties 一般在部署Tomcat后,运行久了,catalina.out文件会越来越大,对系统 ...

  6. 【小白的CFD之旅】08 CFD速成之道

    学了那么一个星期的流体力学,又看了一周的计算流体力学,小白对于如何应用CFD解决工程流体问题,依然是一无所知.眼看一个月的时间已经过半,小白有点着急起来.于是在一个阳光明媚的早晨,小白又找到了黄师姐. ...

  7. 苹果iOS强制HTTPS迫在眉睫,距离2017年只剩1天,准备好了么?

    其实不久前苹果就发了通告,要求ios上的应用全部以HTTPS来进行接口调用以及数据访问,这样做是为了数据安全,一方面为了自己,另一方面也是对应用的要求更加严格,这么做很好,也加强了市场app的规范,虽 ...

  8. UVA 10564 Paths through the Hourglass[DP 打印]

    UVA - 10564 Paths through the Hourglass 题意: 要求从第一层走到最下面一层,只能往左下或右下走 问有多少条路径之和刚好等于S? 如果有的话,输出字典序最小的路径 ...

  9. CentOS7安装MySQL、Redis、RabbitMQ

    系统版本 CentOS Linux release 7.2.1511 (Core) MySQL安装 一.下载mysql的repo源 wget http://repo.mysql.com/mysql-c ...

  10. MODI与VB6

    作者:马健邮箱:stronghorse_mj@hotmail.com主页:http://www.comicer.com/stronghorse发布:2016.12.16 在我写的<用MODI O ...