160407、java实现多线程同步
2016-04-07 18:30
453 查看
多线程就不说了,很好理解,同步就要说一下了。同步,指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系。所以同步的关键是多个线程对象竞争同一个共享资源。
同步分为外同步和内同步。外同步就是在外部创建共享资源,然后传递到线程中。代码如下:
class MyThread implements java.lang.Runnable {
private int threadId;
private Object obj;
public MyThread(int id, Object obj) {
this.threadId = id;
this.obj = obj;
}
@Override
public void run() {
synchronized (obj) {//实现obj同步
for (int i = 0; i < 100; ++i) {
System.out.println("Thread ID: " + this.threadId + " : " + i);
}
}
}
}
public class TestThread {
public static void main(String[] args) throws InterruptedException {
Object obj = new Object();
for (int i = 0; i < 10; ++i) {
new Thread(new MyThread(i, obj)).start();//obj为外部共享资源
}
}
}
内同步,就是在线程内部创建对象,然后实现同步。因为类成员变量可以被类的所有实例共享,所有可以利用这一特性实现:
代码如下:
class MyThread implements java.lang.Runnable {
private int threadId;
private static Object obj = new Object();
public MyThread(int id) {
this.threadId = id;
}
@Override
public void run() {
synchronized (obj) {
for (int i = 0; i < 100; ++i) {
System.out.println("Thread ID: " + this.threadId + " : " + i);
}
}
}
}
public class TestThread {
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 10; ++i) {
new Thread(new MyThread(i)).start();
}
}
}
同步分为外同步和内同步。外同步就是在外部创建共享资源,然后传递到线程中。代码如下:
class MyThread implements java.lang.Runnable {
private int threadId;
private Object obj;
public MyThread(int id, Object obj) {
this.threadId = id;
this.obj = obj;
}
@Override
public void run() {
synchronized (obj) {//实现obj同步
for (int i = 0; i < 100; ++i) {
System.out.println("Thread ID: " + this.threadId + " : " + i);
}
}
}
}
public class TestThread {
public static void main(String[] args) throws InterruptedException {
Object obj = new Object();
for (int i = 0; i < 10; ++i) {
new Thread(new MyThread(i, obj)).start();//obj为外部共享资源
}
}
}
内同步,就是在线程内部创建对象,然后实现同步。因为类成员变量可以被类的所有实例共享,所有可以利用这一特性实现:
代码如下:
class MyThread implements java.lang.Runnable {
private int threadId;
private static Object obj = new Object();
public MyThread(int id) {
this.threadId = id;
}
@Override
public void run() {
synchronized (obj) {
for (int i = 0; i < 100; ++i) {
System.out.println("Thread ID: " + this.threadId + " : " + i);
}
}
}
}
public class TestThread {
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 10; ++i) {
new Thread(new MyThread(i)).start();
}
}
}
相关文章推荐
- SSH框架搭建步骤(笔记)
- Java内存溢出详解及配置
- java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 解决方法
- MyEclipse启动一直停留在Loading workbench界面上的处理
- Java实现插入排序之直接插入排序
- java生成验证码
- hdu2026.java字符
- springmvc学习笔记--ueditor和springmvc的集成
- HashMap中capacity、loadFactor、threshold、size等概念的解释
- ElasticSearch java API-使用More like this实现基于内容的推荐
- ElasticSearch java API-使用More like this实现基于内容的推荐
- eclipse修改背景颜色【代码区和Package Explorer】
- Spring IOC
- spring 注解
- Rxjava学习笔记
- Android studio 导入Eclipse project 注意事项
- Spring Websocket一个错误
- 【Java 基础】Java 泛型简单入门
- eclipse消除和展示特殊符号
- Java 动态代理机制分析及扩展