线程是干活的
所以线程一定是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. 微信小程序_(组件)scroll-view可滚动视图

    微信小程序scroll-view组件官方文档 传送门 提前准备:使用<view>组件制作五条撑满的横向区域 <!--index.wxml--> Cynical丶Gary < ...

  2. 用 Docker 搭建 ORACLE 数据库开发环境

    用 Docker 搭建 ORACLE 数据库开发环境 需要安装 ORACLE 数据库做开发,直接安装的话因为各类平台的限制,非常复杂,会遇到很多问题. 还好,现在有 Docker 化的部署方式,省去很 ...

  3. C++入门经典-例7.9-对象数组,批量化生产

    1:在数组内容中我们了解到,数组是通过指针分配到的一段额定大小的内容.同样,数组也可以包含对象.声明对象数组的形式如下: box boxArray[5]; box boxArray2[2]={box( ...

  4. Python 之 subprocess模块

    一.subprocess以及常用的封装函数运行python的时候,我们都是在创建并运行一个进程.像Linux进程那样,一个进程可以fork一个子进程,并让这个子进程exec另外一个程序.在Python ...

  5. Appium移动自动化测试(四)之元素定位

    做过UI自动化测试的童鞋都会发现, 在上一篇文章中居然没有万能定位方式Xpath. 是滴, 确实没有! ADT自带的uiautomatorviewer里面并没有属性xpath, 如果我们需要的话,还需 ...

  6. 使用 certbot 自动给 nginx 加上 https

    概述 目前,Let's Encrypt 可以算是最好用的 https 证书申请网站了吧.而 certbot 可以算是它的客户端,能够很方便的自动生成 https 证书.我把自己的使用经历记录下来,供以 ...

  7. php下关于字符串与数组的相互转换的函数

    public static function string2array($tags)    {        return preg_split('/\s*,\s*/',trim($tags),-1, ...

  8. k8s开启cadvisor http 服务

    k8s开启cadvisor http 服务 cadvisor介绍: Google的 cAdvisor 是另一个知名的开源容器监控工具. 只需在宿主机上部署cAdvisor容器,用户就可通过Web界面或 ...

  9. Java 多线程爬虫及分布式爬虫架构

    这是 Java 爬虫系列博文的第五篇,在上一篇 Java 爬虫服务器被屏蔽,不要慌,咱们换一台服务器 中,我们简单的聊反爬虫策略和反反爬虫方法,主要针对的是 IP 被封及其对应办法.前面几篇文章我们把 ...

  10. linux下杀进程的方法

    http://www.linuxidc.com/Linux/2011-08/40052.htm kill -s 9 2222