JAVA里代码同步执行 java 同步

java中同步有几种方式啊1 。同步代码块JAVA里代码同步执行:
synchronized(同一个数据){} 同一个数据JAVA里代码同步执行:就是N条线程同时访问一个数据 。
2 。
同步方法:
public synchronized 数据返回类型 方法名(){}

是使用 synchronized 来修饰某个方法JAVA里代码同步执行,则该方法称为同步方法 。对于同步方法而言JAVA里代码同步执行,无需显示指定同步监视器,同步方法JAVA里代码同步执行的同步监视器是
this
也就是该对象的本身(这里指的对象本身有点含糊,其实就是调用该同步方法的对象)通过使用同步方法,可非常方便的将某类变成线程安全的类,具有如下特征:
1 , 该类的对象可以被多个线程安全的访问 。
2,每个线程调用该对象的任意方法之后,都将得到正确的结果 。
3,每个线程调用该对象的任意方法之后,该对象状态依然保持合理状态 。
注:synchronized关键字可以修饰方法 , 也可以修饰代码块,但不能修饰构造器 , 属性等 。
实现同步机制注意以下几点: 安全性高,性能低 , 在多线程用 。性能高,安全性低 , 在单线程用 。
1,不要对线程安全类的所有方法都进行同步,只对那些会改变共享资源方法的进行同步 。
2 , 如果可变类有两种运行环境,当线程环境和多线程环境则应该为该可变类提供两种版本:线程安全版本和线程不安全版本(没有同步方法和同步块) 。在单线程中环境中,使用线程不安全版本以保证性能,在多线程中使用线程安全版本.
线程通讯:
为什么要使用线程通讯?

使用synchronized
来修饰某个共享资源时(分同步代码块和同步方法两种情况),当某个线程获得共享资源的锁后就可以执行相应的代码段,直到该线程运行完该代码段后才释放对该
共享资源的锁,让其他线程有机会执行对该共享资源的修改 。当某个线程占有某个共享资源的锁时 , 如果另外一个线程也想获得这把锁运行就需要使用wait()
和notify()/notifyAll()方法来进行线程通讯了 。
Java.lang.object 里的三个方法wait() notify() notifyAll()
wait方法导致当前线程等待,直到其他线程调用同步监视器的notify方法或notifyAll方法来唤醒该线程 。
wait(mills)方法
【JAVA里代码同步执行 java 同步】都是等待指定时间后自动苏醒,调用wait方法的当前线程会释放该同步监视器的锁定,可以不用notify或notifyAll方法把它唤醒 。
notify()
唤醒在同步监视器上等待的单个线程 , 如果所有线程都在同步监视器上等待,则会选择唤醒其中一个线程 , 选择是任意性的,只有当前线程放弃对该同步监视器的锁定后,也就是使用wait方法后,才可以执行被唤醒的线程 。
notifyAll()方法
唤醒在同步监视器上等待的所有的线程 。只用当前线程放弃对该同步监视器的锁定后 , 才可以执行被唤醒的线程
java 线程同步执行问题sleep和wait有一个共同作用,停止当前线程任务运行,但他们存在一定的不同:1、sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法2、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用3、注意sleep()方法是一个静态方法,Thread.sleep() 。也就是说他只对当前对象有效,通过t.sleep()让t对象进入sleep,这样的做法是错误的,它只会是使当前线程被sleep而不是t线程 。wait属于Object的成员方法 , 一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程;如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源 , 而不限于这个被调用了wait()方法的对象 。wait()方法也同样会在wait的过程中有可能被其他对象调用interrupt()方法而产InterruptedException,效果以及处理方式同sleep()方法

推荐阅读