线程是干活的
所以线程一定是Thread,或者该线程实现Runnable接口
多线程是竞争关系,所以多个线程竞争同一个资源,也就是同一个对象
所以这个竞争对象放到Thread中
即:
// resources是竞争资源
Resources resources = new Resources();
Thread1 thread1 = new Thread1(resources);
Thread2 thread2 = new Thread2(resources);

thread1.start();
thread2.start();

----------------------------------------------------------------------
class Thread1 implements Runnable {
  Resources resources = null;
  Thread1(Resources resources) {
    this.resources = resources;
  }

  public void run() {
    //这个methodA方法时Resources里面的竞争资源方法
    resources.methodA();
  }
}

class Thread2 implements Runnable {
  Resources resources = null;
  Thread2(Resources resources) {
    this.resources = resources;
  }

  public void run() {
    //这个methodA方法时Resources里面的竞争资源方法
    resources.methodA();
  }

}

class Resources {
  private int count = 100;
  //多线程去干活了,它们争着抢着去执行竞争资源里面的方法,所以这个方法区域需要加锁
  public synchronized void methodA() {
    if(count > 0) {
      count--;
     }
  }
}

例子:

package Thread;

public class MultiThread {

    public static void main(String[] args) {
//resources就是竞争资源对象
Resources resources = new Resources();
Runnable1 runnable1 = new Runnable1(resources); for(int i = 0; i <100; i++) {
// 这里是创建多线程去执行任务
//多线程是竞争关系,所以多个线程竞争同一个资源,也就是同一个对象
//所以这个竞争对象放到Thread中
new Thread(runnable1,"Thread"+i).start();
}
} } class Resources {
private int count = 100; //多线程去干活了,它们争着抢着去执行竞争资源里面的方法,所以这个方法区域需要加锁
public synchronized void methodA() {
if(count > 0) {
count--;
}
System.out.println(Thread.currentThread().getName() + " " +"count:"+count);
}
} class Runnable1 implements Runnable {
Resources resources = null;
Runnable1(Resources resources) {
this.resources = resources;
} public void run() {
//这个methodA方法时Resources里面的竞争资源方法
resources.methodA();
} }

.....

多线程可以同时访问同个对象的不同方法吗?

例子:

public class Test66 {
public static void main(String[] args) {
A a = new A();
Thread1 thread1 = new Thread1(a);
Thread2 thread2 = new Thread2(a); thread1.start();
thread2.start();
}
} class A{
public synchronized void method1() throws InterruptedException {
System.out.println("进入method1方法睡5秒");
Thread.sleep(5000);
} public synchronized void method2() throws InterruptedException {
System.out.println("进入method1方法睡2秒");
Thread.sleep(2000);
}
} class Thread1 extends Thread {
A a;
public Thread1(A a) {
this.a = a;
} @Override
public void run() {
try {
a.method1();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} class Thread2 extends Thread {
A a;
public Thread2(A a) {
this.a = a;
} @Override
public void run() {
try {
a.method2();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

修改一下 :讲method2的 synchronized 去掉

class A{
public synchronized void method1() throws InterruptedException {
System.out.println("进入method1方法睡5秒");
Thread.sleep(5000);
System.out.println("进入method1结束");
} public void method2() throws InterruptedException {
System.out.println("进入method2方法睡2秒");
Thread.sleep(2000);
System.out.println("进入method2结束");
}
}

因此得出结论:同个对象的两个同步方法不能并发执行,也就是一个线程获取了一个对象的锁之后,对应这个对象的其他同步方法也被锁住,其他线程只能等待。若方法没有被synchronized 修饰,则可以多线程并发执行

java 如何编写多线程的代码的更多相关文章

  1. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  2. java 22 - 9 多线程之 代码实现的方式2

    多线程的代码实现: 方式2:实现Runnable接口 步骤: A:自定义类MyRunnable实现Runnable接口 B:重写run()方法 C:创建MyRunnable类的对象 D:创建Threa ...

  3. java 22 - 4 多线程的代码实现的方式1

    需求:我们要实现多线程的程序. 如何实现呢? 由于线程是依赖进程而存在的,所以我们应该先创建一个进程出来. 而进程是由系统创建的,所以我们应该去调用系统功能创建一个进程. Java是不能直接调用系统功 ...

  4. Java中编写线程安全代码的原理(Java concurrent in practice的快速要点)

    Java concurrent in practice是一本好书,不过太繁冗.本文主要简述第一部分的内容. 多线程 优势 与单线程相比,可以利用多核的能力; 可以方便的建模成一个线程处理一种任务; 与 ...

  5. java如何编写多线程

    1.如何实现多线程 1.1实现Runnable接口,实现run()方法. public class Main4 implements Runnable { public static void mai ...

  6. 使用java语言编写窗口按钮

    使用java语言编写窗口按钮 代码如下: package Day08; import java.awt.FlowLayout; import javax.swing.JButton;import ja ...

  7. 编写高质量代码改善java程序的151个建议——导航开篇

    2014-05-16 09:08 by Jeff Li 前言 系列文章:[传送门] 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,慘不忍睹是吧.确实 ...

  8. Java编写高质量代码改善程序的151个建议

    第一章  Java开发中通用的方法和准则 建议1:不要在常量和变量中出现易混淆的字母: (i.l.1:o.0等). 建议2:莫让常量蜕变成变量: (代码运行工程中不要改变常量值). 建议3:三元操作符 ...

  9. 编写高质量代码:改善Java程序的151个建议 --[117~128]

    编写高质量代码:改善Java程序的151个建议 --[117~128] Thread 不推荐覆写start方法 先看下Thread源码: public synchronized void start( ...

随机推荐

  1. JavaWeb-SpringBoot_(上)腾讯云点播服务之视频的上传-demo

    使用Gradle编译项目 传送门 腾讯视频云点播 传送门 项目已托管到Github上 传送门 腾讯云点播服务之视频的显示(下) 传送门 个人腾讯云控制台中的视频管理 IndexController.j ...

  2. MS11-080提权

    前提是你渗透进入了一台服务器 这是微软11年的第80个漏洞 每一个漏洞都有一个对应的kb(补丁) 这里我们直接在kali里面搜索 root@kali:~# searchsploit ms11- --- ...

  3. [CSP-S模拟测试]:射手座之日(dsu on tree)

    题目传送门(内部题103) 输入格式 第一行一个数$n$,表示结点的个数. 第二行$n–1$个数,第$i$个数是$p[i+1]$.$p[i]$表示结点$i$的父亲是$p[i]$.数据保证$p[i]&l ...

  4. Requests 代理池

    Requests 本身不提供代理池,然而爬数据又要用,所以只能自己搞.其实还挺简单的.我也不知道为什么这么有用的 feature 一直没有被加入. import requests class Clie ...

  5. php项目权限系统设计

    原文地址:https://blog.csdn.net/u013090676/article/details/77893237 说起php的权限,很多人都容易想起rbac,这里不多介绍.下面介绍一种通用 ...

  6. 为什么有些应用非VxWorks不可

          实时操作系统(RTOS)是专用于对时间精确度敏感的操作系统.典型的情况是,这种应用需要从传感器收集数据.做出分析并对关键性设备进行控制,例如飞机.列车.手术刀.这类控制必须精准,不容许出现 ...

  7. Omnigraffle

    OmniGraffle 7 Mac 注册码 账号:Appked 密码:MFWG-GHEB-HYTW-CGHT-CSXU-QCNC-SXU https://blog.csdn.net/ChibiMaru ...

  8. cygwin下make指令不存在 & cmd也能用make的配置方法

    最近做毕设需要使用Mask R-CNN,就配置了相关环境,在安装pycocotools时要make,于是决定用cygwin来做.但在路径下make时出现了问题: bash错误:make指令不存在.一番 ...

  9. js调用后台接口进行下载

    js调用后台接口一定不能用ajax location.href=$$pageContextPath +'downfile/down.do?filname='+row.fileUrl;

  10. mysql之备份与恢复

    数据备份全备 备份命令 :mysqldump把数据库的数据以sql语句导出属于逻辑备份 格式 : mysqldump -uroot -p123456 -S 多实例的mysql.sock 数据库名 &g ...