synchronized:线程同步方法使用总结

synchronized:

1.多线程执行同一对象的synchronized函数,线程同步正确;

实例代码如下:

public class Test1 implements Runnable{

//定义同一对象

static Test2 action;

public static void main(String[] args) {

// TODO Auto-generated method stub

Class cls;

try {

cls = Class.forName("Test2");

action = (Test2) cls.newInstance();

Test1 t1 = new Test1();

for (int i=0;i<1;i++){

new Thread(t1).start();

new Thread(t1).start();

new Thread(t1).start();

new Thread(t1).start();

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public  void run() {

// TODO Auto-generated method stub

try {

action.getRandomString();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

public class Test2 {

public static void main(String[] args) {

}

//调用同一对象的synchronized 函数,无需加statci修饰

public  synchronized  void getRandomString() throws InterruptedException {

System.out.println("$$$$$$$$$$$$$$$$$$");

Thread.sleep(1000);

Random random = new Random();

int aa = random.nextInt(10);

int bb = random.nextInt(10);

int cc = random.nextInt(10);

System.out.println(String.valueOf(aa)+String.valueOf(bb)+String.valueOf(cc));

System.out.println("############");

}

}

=====================================================

=====================================================

2.多线程执行不同对象的synchronized函数,线程同步错误;

实例代码如下:

public class Test1 implements Runnable{

public static void main(String[] args) {

try {

Test1 t1 = new Test1();

for (int i=0;i<100;i++){

new Thread(t1).start();

new Thread(t1).start();

new Thread(t1).start();

new Thread(t1).start();

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public  void run() {

// TODO Auto-generated method stub

Class cls;

try {

cls = Class.forName("Test2");

Test2 action = (Test2) cls.newInstance();

action.getRandomString();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

public class Test2 {

public static void main(String[] args) {

}

/**

* @param args

* @throws InterruptedException

*/

//调用不同对象的synchronized 函数,需要加statci修饰,否则线程同步失败

public  synchronized  void getRandomString() throws InterruptedException {

System.out.println("$$$$$$$$$$$$$$$$$$");

Thread.sleep(1000);

Random random = new Random();

int aa = random.nextInt(10);

int bb = random.nextInt(10);

int cc = random.nextInt(10);

System.out.println(String.valueOf(aa)+String.valueOf(bb)+String.valueOf(cc));

System.out.println("############");

}

}

====================================================

=====================================================

3.多线程执行不同对象的synchronized static 函数,线程同步正确;

实例代码如下:

public class Test1 implements Runnable{

public static void main(String[] args) {

try {

Test1 t1 = new Test1();

for (int i=0;i<100;i++){

new Thread(t1).start();

new Thread(t1).start();

new Thread(t1).start();

new Thread(t1).start();

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public  void run() {

// TODO Auto-generated method stub

Class cls;

try {

cls = Class.forName("Test2");

Test2 action = (Test2) cls.newInstance();

action.getRandomString();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

public class Test2 {

public static void main(String[] args) {

}

/**

* @param args

* @throws InterruptedException

*/

//调用不同对象的synchronized 函数,需要加statci修饰,否则线程同步失败

public  synchronized static void getRandomString() throws InterruptedException {

System.out.println("$$$$$$$$$$$$$$$$$$");

Thread.sleep(1000);

Random random = new Random();

int aa = random.nextInt(10);

int bb = random.nextInt(10);

int cc = random.nextInt(10);

System.out.println(String.valueOf(aa)+String.valueOf(bb)+String.valueOf(cc));

System.out.println("############");

}

}

=========================================================

==========================================================

时间: 2024-10-15 02:16:52

synchronized:线程同步方法使用总结的相关文章

java synchronized静态同步方法与非静态同步方法,同步语句块

摘自:http://topmanopensource.iteye.com/blog/1738178 进行多线程编程,同步控制是非常重要的,而同步控制就涉及到了锁. 对代码进行同步控制我们可以选择同步方法,也可以选择同步块,这两种方式各有优缺点,至于具体选择什么方式,就见仁见智了,同步块不仅可以更加精确的控制对象锁,也就是控制锁的作用域,何谓锁的作用域?锁的作用域就是从锁被获取到其被释放的时间.而且可以选择要获取哪个对象的对象锁.但是如果在使用同步块机制时,如果使用过多的锁也会容易引起死锁问题,同

java多线程编程之使用Synchronized块同步方法

synchronized块来同步一个对象变量,也可以使用synchronized块来同步类中的静态方法和非静态方法,下面使用Synchronized块同步方法 synchronized关键字有两种用法.第一种就是在<使用Synchronized关键字同步类方法>一文中所介绍的直接用在方法的定义中. 另外一种就是synchronized块.我们不仅可以通过synchronized块来同步一个对象变量.也可以使用synchronized块来同步 类中的静态方法和非静态方法.synchronized

Java多线程之synchronized线程锁

1 package org.study2.javabase.ThreadsDemo.sync; 2 3 /** 4 * @Auther:GongXingRui 5 * @Date:2018/9/18 6 * @Description:synchronized线程锁 7 **/ 8 public class TicketApp { 9 public static void main(String args[]) { 10 Ticket ticket = new Ticket(); 11 Threa

线程同步基础之使用synchronized实现同步方法

Java的最基本的同步方式,即使用synchronized关键字来控制一个方法的并发访问. 每一个用synchronized关键字声明的方法都是临界区.在Java中,同一个对象的临界区,在同一时间只有一个允许被访问. 静态方法则有不同的行为.用synchronized关键字声明的静态方法,同时只能够被一个执行线程访问,但是其他线程可以访问这个对象的非静态的synchronized方法.必须非常谨慎这一点,因为两个线程可以同时访问一个对象的两个不同的synchronized方法,即其中一个是静态s

多线程编程——线程同步方法

1.五种方式 1.1 synchronized同步方法 使用synchronized关键字修饰的方法.java每个对象都有一个内置锁,当用此关键字修饰方法时,内置锁会保护整个方法.在调用该方法前,需获取内置锁,否则就会处于阻塞状态. 如:public synchronized void save(){} 注:当synchronized关键字修饰静态方法时,会锁住整个类 1.2 synchronized同步代码块 即有synchronized关键字修饰的语句块.被该关键字修饰的语句块会自动被加上内

java 多线程 synchronized块 同步方法

synchronized关键字又称同步锁 当方法执行完后,会自动释放锁,只有一个线程能进入此方法 看看以下的各种例子对synchronized的详细解释 1.是否加synchronized关键字的不同 1 public class ThreadTest { 2 3 public static void main(String[] args) { 4 Example example = new Example(); 5 6 Thread t1 = new Thread1(example); 7 T

wait() ,notify() ,notifyAll(),synchronized 和同步方法锁,对象锁的联系,关系,区别;

一直不明白一个问题,因为在书上关于生产者和消费者的例子里看到一段这样的代码,估计很多人都和我一样迷惑 1 public synchronized void set(String name, String content) { 2 if (!flag) { 3 try { 4 super.wait(); 5 } catch (InterruptedException e) { 6 e.printStackTrace(); 7 } 8 this.setNme(name); 9 ....... 10

C#线程同步方法汇总

我们在编程的时候,有时会使用多线程来解决问题,比如你的程序需要在 后台处理一大堆数据,但还要使用户界面处于可操作状态:或者你的程序需要访问一些外部资源如数据库或网络文件等.这些情况你都可以创建一个子线程去处理, 然而,多线程不可避免地会带来一个问题,就是线程同步的问题.如果这个问题处理不好,我们就会得到一些非预期的结果. 在网上也看过一些关于线程同步的文章,其实线程同步有好几种方法,下面我就简单的做一下归纳. 一.volatile关键字 volatile是最简单的一种同步方法,当然简单是要付出代

synchronized 线程同步

synchronized  通常用来形容一次方法的调用,调用一旦开始,调用者必须等到方法调用返回后,才能继续执行后续的操作. 1.demo package demo1; public class MyThread extends Thread { private int count = 5; @Override public void run() { count--; System.err.println("∽"+currentThread().getName()+"coun